<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>iTklub</title>
	<atom:link href="http://itklub.sk/feed/" rel="self" type="application/rss+xml" />
	<link>http://itklub.sk</link>
	<description></description>
	<pubDate>Sat, 04 Sep 2010 10:21:07 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Linux úplne bez reštartu</title>
		<link>http://itklub.sk/2010/09/04/linux-uplne-bez-restartu/</link>
		<comments>http://itklub.sk/2010/09/04/linux-uplne-bez-restartu/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 10:16:56 +0000</pubDate>
		<dc:creator>Mailan</dc:creator>
		
		<category><![CDATA[Kernel]]></category>

		<category><![CDATA[Linux/Unix]]></category>

		<category><![CDATA[Operačné Systémy]]></category>

		<category><![CDATA[Fedora]]></category>

		<category><![CDATA[Linux Kernel]]></category>

		<category><![CDATA[rebootless]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=300</guid>
		<description><![CDATA[Ako iste viete, jediný dôvod prečo je v dnešnej dobe potrebný reštart pre Linuxový server je zmena hardware, alebo aktualizácia jadra. Zmena alebo významná úprava hardware je vec s ktorou nemôžeme veľa spraviť, avšak aktualizácia Linuxového jadra, to je niečo iné.  S veľkou radosťou chcem celej Linuxovej komunite oznámiť, že už existuje riešenie, ktoré [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.hardware.sk/materials/user129/1107-34183.png" alt="Rambo Linux" width="116" height="116" />Ako iste viete, jediný dôvod prečo je v dnešnej dobe potrebný reštart pre Linuxový server je zmena hardware, alebo aktualizácia jadra. Zmena alebo významná úprava hardware je vec s ktorou nemôžeme veľa spraviť, avšak aktualizácia Linuxového jadra, to je niečo iné. <span id="more-300"></span> S veľkou radosťou chcem celej Linuxovej komunite oznámiť, že už existuje riešenie, ktoré umožňuje aktualizáciu Linuxového jadra priamo počas behu systému, takže odteraz môže váš Linuxový server bežať úplne bez reštartu veľmi dlhú dobu. Presnejšie pokým vám železo na ktorom beží nezhnije :D. Túto problematiku rieši projekt <strong><a href="http://www.ksplice.com/">Ksplice</a></strong>. Pričom aktualizácie na Linuxové jadro je možné od teraz zadarmo sťahovať na distribúcie <a href="http://www.ksplice.com/uptrack/download-ubuntu">Ubuntu Desktop</a> (9.04, 9.10, 10.04 LTS) a <a href="http://www.ksplice.com/uptrack/download-fedora">Fedora 13</a>. K projektu je dostupný aj zdrojový kód. Pričom pre ostatné Linuxové distribúcie sa aktualizácie platia. Takže aj pre Ubuntu Server.</p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2010/09/04/linux-uplne-bez-restartu/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenGL 4 Core 4. časť</title>
		<link>http://itklub.sk/2010/08/28/opengl-4-core-4-cast/</link>
		<comments>http://itklub.sk/2010/08/28/opengl-4-core-4-cast/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 13:37:32 +0000</pubDate>
		<dc:creator>nou</dc:creator>
		
		<category><![CDATA[Nezaradené]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=296</guid>
		<description><![CDATA[Kreslením farebných trojuholníkov sa ďaleko nedostaneme. V prakticky každej hre vidíme vykresľované rôzne povrchy ako sú asfalt, betón, drevo atď. Na to aby sme ich vykreslili realisticky slúži textúrovanie povrchov.
V OpenGL sú textúry väčšinou obyčajné dvojrozmerné obrázky. Každá textúra sa potom nanáša na povrch trojuholníkov ako tapeta na stenu. Oproti tapete sa ale dá textúra [...]]]></description>
			<content:encoded><![CDATA[<p>Kreslením farebných trojuholníkov sa ďaleko nedostaneme. V prakticky každej hre vidíme vykresľované rôzne povrchy ako sú asfalt, betón, drevo atď. Na to aby sme ich vykreslili realisticky slúži textúrovanie povrchov.</p>
<p><span id="more-296"></span>V OpenGL sú textúry väčšinou obyčajné dvojrozmerné obrázky. Každá textúra sa potom nanáša na povrch trojuholníkov ako tapeta na stenu. Oproti tapete sa ale dá textúra pri mapovaní aj rôzne ponaťahovať. To ako sa má textúra nemapovať nám slúžia textúrovacie koordináty. V každom vrchole trojuholníka je potom určený súradnica bodu ktorý sa použije v danom vrchole.<br />
Textúra pozostáva z jednotlivých pixelov. Obrázok má potom svoje rozmery v pixeloch. V OpenGL sa ale používa na adresovanie jednotlivých bodov obrázku súradnice v rozmedzí 0 až 1. Teda stred obrázka s rozmermi či už 256&#215;256 pixelov alebo 1024&#215;1024 je vždy na koordináte [0.5;0.5]. Ľavý dolný roh textúry má koordináty [0;0] pravý dollný [1;0] a pravý horný [1;1]. treba poznamenať že [0;0] je úplný roh textúry. Stred pixela leží na koordinátoch [0.5/w;0.5/h] kde w a h sú výška a šírka textúry. Na tento pol-pixelový posun treba pamätať ak chcete nakresliť na obrazovku niečo presne 1:1. Toto inak platí aj na obrazovku teda rohový pixel má taktiež súradnice v „clip space“ [-1+0.5/w;-1+0.5/h] kde w a h je výsška a šírka viewportu teda rozlíšenie obrazovky (viď glViewport()).<br />
Na textúrovacie koordináty si teda vytvoríme ďalší buffer ktorý ich bude obsahovať. Do initGL() teda pridáme nasledujúce riadky.</p>
<pre><code>
<pre name="code" class="cpp">

texcoord = new GLbuffer;
float tex_coord[] = {0.0f, 0.0f,  1.0f, 0.0f,  0.0f, 1.0f,//texturovacie koordinaty
            0.0f, 1.0f,  1.0f, 0.0f,  1.0f, 1.0f};
texcoord-&gt;loadData(sizeof(tex_coord), tex_coord);
glEnableVertexAttribArray(2);//tretie pole na texturovacie koordinaty
        texcoord-&gt;bind();
        glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0);
shader-&gt;bindAttribLocation(2, &quot;in_texcoord&quot;);
</pre>
<p></code></pre>
<p>Teda vytvoríme buffer, nahráme doňho dáta a nakoniec priradíme tretie vertex attrib pole k vstupu do vertex shaderu typu vec2.<br />
Najprv treba vygenerovať meno textúry za pomoci jednej z ,mnohých glGen* funkcií glGenTextures(). Jej prvým parameterom je počet generovaných textúr a druhým je ukazovateľ na pole kam sa uložia vygenerované mená.</p>
<pre><code>
<pre name="code" class="cpp">

Texture::Texture(GLenum type, FILTERING filter)
{
    glGenTextures(1, &amp;amp;amp;amp;amp;tex);//genreuje meno textury
    target = type;
    this-&gt;filter = filter;
}
</pre>
<p></code></pre>
<p>Keď už textúru nepotrebujeme tak ju uvoľníme. Na to slúži ako ste už mohli uhádnuť glDeleteTextures(). Jej parametere sú rovnaké ako glGenTextures().</p>
<pre><code>
<pre name="code" class="cpp">

Texture::~Texture()
{
    glDeleteTextures(1, &amp;amp;amp;amp;amp;tex);//uvolni texturu
}
</pre>
<p></code></pre>
<p>Na to aby sme mohli použiť textúru pri vykresľovaní tak ju musíme priradiť do jednej z textúrovacých jednotiek. Takých jednotiek je dostupných v OpenGL 3 minimálne 48 a v OpenGL 4 až 80. V staršom OpenGL 2 bol tento limit nastavený len na 2 jednotky. Tento počet je ale súčet koľko je možné použiť vo všetkých stupňoch shaderov. Teda počet textúr ktoré sa použijú napr vo vertex a fragment shaderi nemože spolu presiahnuť tento počet. Malé upozornenie počet jednotiek vo vertex shaderi býva oproti fragment shader dosť obmendzené. I keď moderný HW podporujúci OpenGL 3.1 a novší musí podporovať 16 jednotiek pre každý typ shadera. Aj tá istá textúra použitá a priradená do tej istej textúrovacej jednotky vo vertex a fragment shader sa ale počíta ako dve použité jednotky.<br />
Textúru môžeme priradiť podľa jej typu do rôzneho cieľa. Zatiaľ nám stačí že 1D textúry sa priraďujú do GL_TEXTURE_1D, dvoj rozmerné do GL_TEXTURE_2D a trojrozmerné do GL_TEXTURE_3D.</p>
<pre><code>
<pre name="code" class="cpp">

void Texture::bind(int unit)
{
    glActiveTexture(GL_TEXTURE0+unit);//urci ktoru texturovaciu jednotku ideme pouzit a ktora je aktivna
    glBindTexture(target, tex);//priradi texturu do aktivnej texturovacej jednotky
}
</pre>
<p></code></pre>
<p>V loadTexture() ktorá má dokopy veľa parametrov. Prvým je interný formát dát ktoré má OpenGL použiť na uloženie dát. Medzi základné patrí GL_RGBA, GL_RGB, GL_RED, GL_RG, GL_DEPTH_COMPONENT, GL_DEPTH_STENCIL.<br />
Písmená sú odvodené od anglických názov základných farebných kanálov v obrázkoch.</p>
<ul>
<li> R – red – červená</li>
<li> G – green – zelená</li>
<li> B – blue – modrá</li>
<li> A – alpha – alfa (prihľadnosť)</li>
</ul>
<p>GL_DEPTH_COMPONENT je formát pre uloženie hĺbkových dát zo Z-buffera a GL_DEPTH_STENCIL je formát ktorý kombinuje hlbkové a dáta z stencil buffera do jedného. Okrem týchto základných formátov môžete presnejšie špecifikovať formát. Existujú aj varianty ktoré určia presný dátový typ ktorý sa má použiť. Je ich veľmi veľa preto uvedimlen zopár na ukážku. GL_RGBA8 môžete explicitne vyjadriť že chcete aby každý kanál obsahoval 8 bitov. Ďalej GL_RGBA32F aby sa farby uložili ako 32 bitové float čisla. Potom sú dostupné aj jedno, dvoj a troj kanálové varianty ktoré začínajú obsahujú len R, RG alebo RGB zložky.<br />
Druhý až tretí parameter je jednoducho šírka, výška a hĺbka nahrávaného obrázka v pixeloch. Hĺbka sa používa ak sa nahráva aj 3D textúra ktorá je ako keby na sebe navrstvené 2D obrázky. Počet vrstiev potom určuje hĺbku. Piaty určuje formát nahrávaných dát. Tam može byť zase GL_RGB ale aj GL_BGR alebo GL_ABGR kedy sa proste určí poradie kanálov v dátach. Dátový typ dát určuje nasledujúci parameter. Možné hodnoty sú GL_BYTE, GL_SHORT, GL_INT, GL_HALF a GL_FLOAT plus pri celo číselných aj UNSIGNED varianty napr. GL_UNSIGNED_INT. Posledným parametrom je ukazateľ na samotné dáta. Ten môže byť aj NULL. Vtedy sa len alokuje pamäť pre textúru ale nekopírujú sa žiadne dáta. To je v určitých ideme do danej textúry kresliť za pomoci samotného OpenGL.</p>
<pre><code>
<pre name="code" class="cpp">

void Texture::loadTexture(GLint internal, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *data)
{
    glBindTexture(target, tex);//priradime texturu do texturovacej jednotky
    switch(target)//podla typu textury
    {
        case GL_TEXTURE_1D:glTexImage1D(target, 0, internal, width, 0, format, type, data);break;
        case GL_TEXTURE_2D:glTexImage2D(target, 0, internal, width, height, 0, format, type, data);break;
        case GL_TEXTURE_3D:glTexImage3D(target, 0, internal, width, height, depth, 0, format, type, data);break;
    }
    if(filter != NONE)glGenerateMipmap(target);//pouzijeme filtering preto treba vygenerovat mipmapy.
    setFiltering();//nastavy texturovacie filtry
}
</pre>
<p></code></pre>
<p>Význam glBindTexture() už poznáte. Tie tri funkcie glTexImageND slúžia na nahratie samotných dát do OpenGL. Líšia sa jedine s počtom rozmerových parametrov kedy 1D varianta berie len šírku kým 3D šírku, výšku aj hĺbku. Druhý parameter určuje úroveň mipmapy ktorú chceme nahrať dáme nulu keďže nahrávame základnú úroveň. Potom ide interný formát nasledujú rozmery. Za nimi je hrúbka okraja. Zvyšné parametre sme si už vysvetlili. Ak sme sa rozhodli použiť filtráciu vtedy treba vygenerovať mipmapy. Mipmapy sú sada zmenšených verzii textúry vždy o polovicu. Teda ak má základná nultá úroveň rozmery 256&#215;256 tak jednotková úroveň bude mat rozmery 128&#215;128 dvojková 64&#215;64 atď. Na to slúži ten druhý parameter funkcii glTexImage*() kedy môžete si ručne vytvoriť mipmapy a tie nahrať postupne so zvyšujúcou sa úrovňou. Toto necháme na OpenGL a glGenerateMipmap() sa o to postará.<br />
setFiltering() nastavuje filtre ktoré sa použijú na textúru pri vykresľovaní. Nastavenie filtrov pozostáva z dvoch filtrov. Prvým je filter ktorý sa použije pri zväčšovaní a druhý je filter ktorý sa použije pri zmenšovaní.</p>
<pre><code>
<pre name="code" class="cpp">

void Texture::setFiltering()
{
    int mag,min;
    float aniso = 0;
    switch(filter)
    {
        case NONE:
        mag = min = GL_NEAREST; break;
        case BILINEAR:
        mag = GL_LINEAR;
        min = GL_LINEAR_MIPMAP_NEAREST; break;
        case TRILINEAR:
        case ANISO2:
        case ANISO4:
        case ANISO8:
        case ANISO16:
        mag = GL_LINEAR;
        min = GL_LINEAR_MIPMAP_LINEAR; break;
    }
</pre>
<p></code></pre>
<p>Pre zväčšovanie sú možné len dve možnosti a to GL_NEREST a GL_LIENEAR. Prvá možnosť vyberie najbližší pixel a jeho hodnota sa použije ako výstupná vzorka. Pri GL_LINEAR sa zoberú štyry najbližšie pixely a medzi nimi sa lineárne interpoluje výsledná vzorka. Pri zmenšovaní je možností viac. Najprv je tu GL_NEAREST a GL_LINEAR ktoré majú rovnaký efekt ako pri zvečšovaní. Potom sú tu ešte varianty pridaním k predchádzajúcim dvom _MIPMAP_NEAREST alebo _MIPMAP_LINEAR. Týmto sa zapína použitie mipmapingu. Prvé slovo potom určuje filtrovanie v rámci jednej úrovne mipmap a slovo za MIPMAP potom či sa má interpolovať aj medzi mipmapami. Teda napríklad GL_LINEAR_MIPMAP_NEAREST vyberie najbližšiu vhodnú mipmapu a v nej lineárne interpoluje zo štyroch pixelov ako vzorku. GL_LINEAR_MIPMAP_LINEAR navyše vyberie druhú najvhodnejšiu mipmapu z nej taktiež vyfiltruje a medzi týmito vzorkami sa lineárne interpoluje.</p>
<pre><code>
<pre name="code" class="cpp">

    switch(filter)
    {
        case ANISO2: aniso = 2; break;
        case ANISO4: aniso = 4; break;
        case ANISO8: aniso = 8; break;
        case ANISO16: aniso = 16; break;
        default: break;
    }
</pre>
<p></code></pre>
<p>Anizotropné filtrovanie zapína ešte aj vytváranie mipmap ktoré sú zmenšované naraz iba v jednej ose. Teda z textúry 256&#215;256 vytvorí ešte aj 256&#215;128, 256&#215;64 atď. To zvyšuje kvalitu pri naklonených povrchoch kedy klasicky mipmaping textúry v diaľke rozmazáva. Úroveň anizotropného filtrovania určuje koľko úrovní mipmap sa vytvorí.</p>
<pre><code>
<pre name="code" class="cpp">

    glTexParameteri(target, GL_TEXTURE_MAG_FILTER, mag);//filter ktory sa pouzije pri zvetsovani textury
    glTexParameteri(target, GL_TEXTURE_MIN_FILTER, min);//filter ktory sa pouzije pri zmensovani textury
    if(aniso)glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);//nastavy level anizotropneho filtrovania
}
</pre>
<p></code></pre>
<p>Na nastavenie parametrov textúr slúžia sada funkcií glTexParameter*(). Prvý parameter určuje cieľ ktorého priradená textúra bude ovplyvnená. Druhý parameter určuje ktorú vlastnosť ideme nastavovať. No a posledný je samotná hodnota ktorú nastavujeme. Okrem použitých parametrov  ešte spomeniem aj GL_TEXTURE_WRAP_[S T R]. Ako tretí parameter môže byť potom použitý GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_REPEAT a  GL_MIRRORED_REPEAT. Súvisí to s opakovaním textúr ak textúrovacie koordináty prekročia hranicu 0 až 1. Na nasledujúcich obrázkoch je pre S súradnicu nastavené GL_REPEAT a pre T GL_MIRRORED_REPEAT. Na druhom je to kombináci GL_CLAMP_TO_EDGE a GL_CLAMP_TO_BORDER.</p>
<p style="text-align: center;"><a href="http://itklub.sk/wp-content/uploads/2010/08/repeat.png"><img class="aligncenter size-full wp-image-297" src="http://itklub.sk/wp-content/uploads/2010/08/repeat.png" alt="repeat" width="480" height="360" /></a><a href="http://itklub.sk/wp-content/uploads/2010/08/clamp.png"><img class="aligncenter size-full wp-image-298" src="http://itklub.sk/wp-content/uploads/2010/08/clamp.png" alt="clamp" width="480" height="360" /></a><br />
Nakoniec ešte do initGL() pridáme vytvorenie samotnej textúry. Môžete si skúsiť meniť typ filtrovania a pozorovať aký to ma vplyv na kvalitu. Na načítanie použijeme loadBMP(). Táto funkcia využíva SDL na načítanie BMP obrázka a potom ho otočí hore nohami. OpenGL totiž očakáva že pixely obrazu ktoré sú na [0,0] dorazia ako prvé. SDL ale má konvenciu že [0,0] je hore a nie dole. Následne sa textúra priradí do tetúrovacej jednotky nula a v shadery sa taktiež nastavý číslo tejto jednotky.</p>
<pre><code>
<pre name="code" class="cpp">

        texture = new Texture(GL_TEXTURE_2D, Texture::TRILINEAR);
        SDL_Surface *tex = loadBMP(&quot;cb.bmp&quot;);
        texture-&gt;loadTexture(GL_RGB, tex-&gt;w, tex-&gt;h, 0, GL_BGR, GL_UNSIGNED_BYTE, tex-&gt;pixels);
        texture-&gt;bind(0);
        shader-&gt;setUniform(&quot;texture&quot;, 0);
        SDL_FreeSurface(tex);
</pre>
<p></code></pre>
<p>Vo vertex shadery podáme ďalšiu vstupnú attribute premennú in_texcoord ktorú potom v tele main() len jednoducho predáme ďalej do výstupnej premennej texcoord.</p>
<pre><code>
<pre name="code" class="cpp">

in vec2 in_texcoord;
texcoord = in_texcoord;
</pre>
<p></code></pre>
<p>V fragment shadery vykonáme trochu viacej zmien. Prvou je pridanie uniform premennej typu sampler2D. Existuje samozrejme aj 1D a 3D varianta. V initGL() je potrebné nastaviť jej hodnotu na číslo textúrovacej jednotky v ktorej je priradená textúra. Pozor nie meno textúry, toto je dosť častý omyl. Typ sampler musí byť samozrejme kompatibilný s typom priradenej textúry (kompatibilný pretože je možné napr. priradiť 3D textúru ako sampler2DArray).<br />
Potom je už len funkcia texture() ktorá  vracia vec4 obsahujúci farebné zložky. Jej druhým parametrom je vec2 určujúci odkiaľ sa má zobrať vzorka. Pokiaľ je sampler typu 1D tak berie iba skalár teda float a keď je sampler 3D tak berie vec3.</p>
<pre><code>
<pre name="code" class="cpp">

uniform sampler2D texture;//sampler z ktoreho budeme ziskavat vzorky

in vec3 color;
in vec2 texcoord;

void main()
{
    gl_FragColor = texture(texture, texcoord); //ziskame vzorku z textury a tu nasledne pouzijeme
    //gl_FragColor = texture(texture, vec2(texcoord.s, texcoord.t+sin(texcoord.s*20.0)/20.0)); //mozete skusit odkomentovat
}
</pre>
<p></code></pre>
<p>Zdrojové kódy: <a href="http://itklub.sk/wp-content/uploads/2010/08/lekcia04.zip">lekcia04</a></p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2010/08/28/opengl-4-core-4-cast/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenGL 4 Core 3. časť</title>
		<link>http://itklub.sk/2010/08/15/opengl-4-core-3-cast/</link>
		<comments>http://itklub.sk/2010/08/15/opengl-4-core-3-cast/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 11:42:59 +0000</pubDate>
		<dc:creator>nou</dc:creator>
		
		<category><![CDATA[Programovanie]]></category>

		<category><![CDATA[Matice]]></category>

		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=288</guid>
		<description><![CDATA[V OpenGL 3 a vyššom boli odstránené všetky funkcie na prácu s maticami keďže boli odstránené spolu s fixnou pipeline. Dnešná časť bude dosť teoretická. Bude o tom ako umiestniť vykresľované trojuholníky do priestoru. V minulých dieloch sme vykresľovali dva trojuholníky.

Ak sa pozriete na súradnice ktoré sme použili tak sú 0,9 až 0,95 a potom [...]]]></description>
			<content:encoded><![CDATA[<p>V OpenGL 3 a vyššom boli odstránené všetky funkcie na prácu s maticami keďže boli odstránené spolu s fixnou pipeline. Dnešná časť bude dosť teoretická. Bude o tom ako umiestniť vykresľované trojuholníky do priestoru. V minulých dieloch sme vykresľovali dva trojuholníky.</p>
<p><span id="more-288"></span></p>
<p>Ak sa pozriete na súradnice ktoré sme použili tak sú 0,9 až 0,95 a potom zaberali takmer celú obrazovku. To je pretože vaša obrazovka ako keby tvorí stenu jednotkovej kocky. Takej kocky ktorej jeden roh má súradnice [-1;-1;-1] a protiľahlý [1;1;1].</p>
<p><div id="attachment_289" class="wp-caption aligncenter" style="width: 367px"><a href="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m1bfdade9.png"><img class="size-full wp-image-289" src="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m1bfdade9.png" alt="jednotková kocka" width="357" height="269" /></a><p class="wp-caption-text">jednotková kocka</p></div></p>
<p>Predná stena tejto kocky predstavuje plátno na ktoré sa premieta všetko čo je vnútri tejto kocky. Preto bod so xy-súradnicami [1;1] sa vykreslí v hornom pravom rohu. Tretí určuje hĺbku bodu tá neovplyvňuje výslednú pozíciu na obrazovke ale zaleží na nej ak sa nejaké dva objekty budu prekrývať. Zadávať ale súradnice v rozmedzí [-1;1] ale nie je príliš praktické. Na manipuláciu s bodmi a trojuholníkmi nám v OpenGL slúžia transformácie. Tieto transformácie sú vyjadrené pomocou matíc <a href="http://sk.wikipedia.org/wiki/Matica_%28matematika%29">http://sk.wikipedia.org/wiki/Matica_%28matematika%29</a> v skratke je to množina čísel usporiadané do tabuľky. V OpenGL je to väčšinou štyri krát štyri. Toto číslo voláme dimenziou matice. Maticou dokážeme vyjadriť projekciu z jedného priestoru do iného. Teda keď máme súradnice v nejakej súradnicovej sústave dokážeme získať súradnice v inej sústave. Sústava súradníc je klasická karteziánska sústava troch na seba kolmích osí na ktorých vyjadríme šírku výšku a hĺbku.</p>
<p>Vystrite ukazovák a palec aby ste dostali L. K tomu ešte vystrite prostredník aby bol kolmo na dlaň. Tým dostane provizórnu karteziánskú sústavu. Ak si teraz zoberiete nejaký bod pri vašej ruke tak si ho môžete vyjadriť hneď v troch priestoroch. Relatívne voči vašej ruke tomu sa v OpenGL hovorí „model space“ teda priestor modelu. Ďalší priestor je absolútny kde ako osi môžete zobrať roh miestnosti a z neho vybiehajúce kúty ako osi tomu sa hovorí „world space“ alebo priestor sveta. No a nakoniec tu je priestor relatívne voči vašemu oku. To je takzvaný „eye space“ alebo priestor oka teda ako je daný bod vľavo-vpravo hore-dolu alebo ďaleko voči oku.</p>
<p>So súradnicami v eye space sa následne vykonajú ešte dve operácie. Perspektívne  delenie a transformácia na rozmery obrazovky. V OpenGL používajú homogénne súradnice. To znamená že okrem troch priestorových súradníc x,y,z sa pridáva ešte štvrtá w. Tá vetšinou nadobúda hodnotu 1,0 a občas 0,0. Ako sme si už povedali ak je vo vstupnom VBO definované menej zložiek ako je deklarovaných pre vstup vertex shader tak sa zvyšné zložky automaticky dopĺňajú kde x,y,z sú automaticky 0 a w 1.</p>
<p>Perspektívne delenie je potom vydelenie celého vektora w. Teda výsledný vektor bude x/w, y/w, z/w, w/w. Ako je vidno tak potom má w hodnotu 1. Súradnice x,y,z ktoré sú potom v rozsahu [-1;1] sú potom viditeľné.</p>
<p>Keď som popisoval transformáciu medzi jednotlivými súradnicovými sústavami na ktoré slúžia matice 4&#215;4 tak pri týchto transformáciách sa nemení w. Tá sa zmení až pri poslednou projekčnou maticou. Tým sa dosiahne perspektíva teda zbiehanie rovnobežiek v jenom bode na obrazovke.</p>
<p>Ak máme súradne v rozsahu [-1;1] tak poslednou vecou ktorá sa urobý je na-mapovanie týchto rozmerov na fyzické rozmery obrazovky a pixely.</p>
<p><div id="attachment_290" class="wp-caption aligncenter" style="width: 138px"><a href="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m2f59be5a.gif"><img class="size-full wp-image-290" src="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m2f59be5a.gif" alt="jednotková matica" width="128" height="85" /></a><p class="wp-caption-text">jednotková matica</p></div></p>
<p>Hore je zobrazená jednotková matica ktorá nemá žiadny účinok. V OpenGL sa matice zapisujú sprava doľava. Teda ak máme zapísané<a href="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m53ee300.gif"><img class="alignnone size-full wp-image-292" src="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m53ee300.gif" alt="lekcia03_html_m53ee300" width="92" height="19" /></a> čo znamená že vektor v najprv transformujeme maticou M a následne P. Druhý priamočiarejší pohľad je vynásobiť matice P a M a nimi následne násobiť vektor. Násobenie matíc je totiž asociatívne teda že (A*B)*C = A*(B*C) (vektor je taktiež matica) ale pozor <a href="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m3789aace.gif"><img class="alignnone size-full wp-image-293" src="http://itklub.sk/wp-content/uploads/2010/08/lekcia03_html_m3789aace.gif" alt="lekcia03_html_m3789aace" width="88" height="19" /></a>okrem určitých prípadov. Taktiež nie je možné násobiť akékoľvek matice. Ich rozmery musia byť KxM a NxK teda počet stĺpcov prvej matice musí byť rovnaký ako počet riadkov druhej. Výsledná matica bude potom NxM. V matematickej literatúre sa môžete stretnúť s opačným značením teda MxN znamená matica s M riadkami a N stĺpcami.</p>
<p>V programoh budeme využívať vlastnú triedu Matrix na prácu s maticami. Prvou o ktorej sipovieme je perspective() keďže na koniec initGL() pridáme tento kód.</p>
<pre><code>
<pre name="code" class="cpp">

        Matrix m; // vytvorime si jednu maticu
        m.perspective(50, (float)WIDTH/HEIGHT, 0.1, 100); //vytvorime maticu perspektivnej projekcie
        shader-&gt;setUniform(&quot;projection&quot;, m);//nastavime maticu do shaderu
</pre>
<p></code></pre>
<p>Ako prvé si vytvoríme objekt matice. Štandardne obsahuje takáto matica jednotkovú maticu teda maticu ktorá ma diagonále jednotky a všade inde nuly. Ďalej sa zavolá metóda perspektive() ktorá vytvorí maticu perspektívnej projekcie. Táto matica nám zabezpečí premietanie 3D objektov na 2D plochu našej obrazovky rovnako ako premieta šošovka vo fotoaparáte svet pred ním na film. Prvým parameter určuje koľko stupňov na výšku uvidí naša kamera teda zorné pole. Druhým je pomer strán obrazu. A nakoniec je tu vzdialenosť k blízkej a vzdialenej orezávacej rovine. Všetko čo kamera uvidí bude musieť byť v zkosenom ihlane. To je ihlan ktorý ma odrezaný vrchol. Nakoniec obsah matice nastavíme do uniform premennej vertex shadery.</p>
<p>Do OpenGL teda matice ktoré si vypočítame dostaneme ako uniform premennú v shadery. Teda k vecx typom si ešte pridamé matMxN kde M a N môžu byť v rozmedzí 2 až 4. M označuje počet stĺpcov a N počet riadkov. Na nastavenie hodnoty týchto uniform nám potom slúžia funkcie glUniformMatrixMfv(int location, sizei count, bool transpose, const float *value) a glUniformMatrixMxNfv() kde M a N môžu byť zase 2 až 4. Funkcie ako ich názov napovedá k nastaveniu hodnoty zodpovedných typov matíc. Funkcie  glUniformMatrixMfv() slúžia na nastavenie štvorcových matíc o rozmeroch M krát M. Ich parametre sú podobné ako pri prechádzajúcich funkciách. Prvý parameter je lokácia ktorú získame s pomocou glGetUniformLocation(). Nasleduje počet matíc ktoré nahrávame. Potom či sa má matica pred nahratím transponovať teda otočiť okolo diagonály, spomeňte si že OpenGL uchováva matice v stĺpcovom poradí takže tu môžete poslať maticu v riadkovom usporiadaní a potom dať tento parameter true. Nakoniec ukazovateľ na pole obsahujúce hodnoty prvkov matíc.<br />
Na začiatok metódy draw() si dáme nasledovný kód.</p>
<pre><code>
<pre name="code" class="cpp">

        Matrix m;
        m.lookAt(0, 0, 4, 0, 0, 0);
        m.rotate(rott, 1, 0, 0);
        m.rotate(rott*1.74, 0, 1, 0);
        rott += 0.2;
        shader-&gt;setUniform(&quot;modelview&quot;, m);
</pre>
<p></code></pre>
<p>Zase vytvoríme jednu maticu. Metódou lookAt() sa posunieme na pozíciu určenú prvými troma parametrami určujúcimi X,Y a Z súradnice v priestore. Nasledujúce tri parametre určujú bod kam sa bude kamera pozerať. V tomto prípade je to počiatok súradnicovej sústavy. A nakoniec sa dajú nastaviť posledné tri parametre ktoré majú implicitnú hodnotu [0;1;0]. Tieto čísla určujú smer nahor v tomto prípade v smere osi y. Kedže máme bod kam sa pozeráme a odkiaľ sa pozeráme chýba nám ešte orientácia okolo osi tvorenej týmito dvoma bodmi.<br />
Nasleduje metóda rotate() ktorá otočí objekt. Jej prvým parametrom je uhol o ktorý sa má otočiť. Ďalšie tri parametre určujú vektor okolo ktorého sa bude otáčať. Tu môžete vidieť tri transformácie. Každá je reprezentovaná jednou maticou ktorá sa vytvorí pri volaní metód lookAt(),rotate() a aj perspective(). Každá takto vytvorená matica sa následne vynásobí s aktuálnou maticou a použije sa tá. Teda ak máme maticu M tak pri volaní metód sa vytvorí matica C. Vo výsledku potom matica M&#8217; bude obsahovať M*C. Teda napr. v našom prípade sa najprv vytvorí jednotková matica E. Potom lookAt() vytvorí L a dve rotate() R a S. Vo  výsledku vznikne matica M = E*L*R*S. Touto maticou sa budú následne transformovať vrcholy teda násobiť L*R*S*v (jednotkovú maticu môžeme ignorovať keďže je to rovnako ako keď vynásobíte 1*5). Ako si môžete všimnúť tak sa matice skladajú postupne po sebe a teda transformácia ktorú aplikujeme v kóde ako prvú sa vykoná ako posledná.<br />
Na tieto transformácie sa dá aj nazerať ako na posúvanie sveta okolo vás. Teda na začiatku je kamera v bode [0;0;0] a pozerá smerom do mínus Z. Prvé lookAt() potom presunie počiatok súradnicovej sústavy na zadanú pozíciu. Nasledujúce rotate() otočí súradnicovú sústavu okolo osi X o daný počet stupňov. Smer otáčania je v smere hodinových ručičiek pri pohľade v smere vektora otáčania. Ako keby ste zakrúcali vývrtku a tá smeruje v osi vektora. Druhá rotácia otočí sústavu zase okolo osi Y. Tu treba spomenúť jednu veľmi dôležitú vec. Všetky tieto transformácie, rotácie a posuny sú vykonávané relatívne k danej súradnicovej osi. Teda prvé rotate() otáča okolo osi ktorá je  vtedy už mimo. A ešte k tomu následné druhé rotate() okolo osi Y už otáča už okolo lokálnej osi Y ktorá je pootočená predchádzajúcou rotáciou. Teda keď robíte akúkoľvek transformáciu musíte myslieť relatívne a nie voči nejakému absolútnemu počiatku.<br />
Náš vertex shader musíme teraz upraviť nasledovne.</p>
<pre><code>
<pre name="code" class="cpp">

uniform mat4 modelview; // uniform premenna na model view maticu
uniform mat4 projection; // uniform premenna na projekcnu maticu

in vec4 in_position; //prvy vstupny atribut pozicia vrchola
in vec3 in_color; //druhy atribut farba vrchola

out vec3 color; //vystup z shadera

void main()
{
	gl_Position = projection * (modelview * in_position); //stupny vertex nasobime najprv modelview a potom projection maticou
	color = in_color; //zapiseme farbu
}
</pre>
<p></code></pre>
<p>Na začiatku pribudli dve uniform premenné. Maticu projection nastavujeme v initGL() a modelview pri každom volaní draw(). Možno ste si už všimli. Uniform premenné netreba nastavovať neustále. Celý program si pamätá všetky uniform premenné.<br />
Nasleduje deklarácia per vertex premenných. V samotnom shadery sa zmenilo len to že teraz je vstupný vertex násobený obidvoma maticami. Tie zátvorky tam nie sú nutné ale je to optimalizácia pre rýchlosť. Inak by sa totiž najprv vynásobili tie dve matice a až potom vektor s maticou. A násobenie dvoch matíc je omnoho náročnejšie ako dve vynásobenia vektor matica.<br />
Najpr sa teda aplikuje modelview matica ktorá nám dostane vertex do „eye space“ teda relatívne voči kamere. Teda súradnica X vyjadruje či je bod vľavo vpravo,Y hore dole a Z vpredu alebo vzadu. Projekčná matica nakoniec prevedie tieto súradnice do „clip space“ teda do jednotkovej kocky.<br />
Odporúčam sa pohrať sa s dosadením vlastných hodnôt do funkcií rotate(), lookAt() a ešte translate(). Tú som síce nepoužil ale jej použitie je jednoduché. Jej tri parametre vyjadrujú posun po  osiach X,Y,Z. Takže skúste si tam pridať aj m.translate(1, 0, 0).</p>
<p><a href="http://itklub.sk/wp-content/uploads/2010/08/lekcia03.zip">lekcia03</a></p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2010/08/15/opengl-4-core-3-cast/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenGL 4 Core 2.časť</title>
		<link>http://itklub.sk/2010/06/10/opengl-4-core-2cast/</link>
		<comments>http://itklub.sk/2010/06/10/opengl-4-core-2cast/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 22:00:15 +0000</pubDate>
		<dc:creator>nou</dc:creator>
		
		<category><![CDATA[Programovanie]]></category>

		<category><![CDATA[GLSL]]></category>

		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=283</guid>
		<description><![CDATA[V tejto časti sa pozrieme na shadery písané v GLSL. S príchodom OpenGL 2.0 prišlo aj GLSL teda OpenGL Shading Language. Programovacý jazyk na programovanie grafických efektov v počítačovej grafike. Pomocou shaderov sa dá naprogramovať efekty od jednoduchého tieňovania, cez bump mapping až po reflexiu a refrakciu materiálov.

V prvej časti sme sa naučili špecifikovať jednotlive [...]]]></description>
			<content:encoded><![CDATA[<p>V tejto časti sa pozrieme na shadery písané v GLSL. S príchodom OpenGL 2.0 prišlo aj GLSL teda OpenGL Shading Language. Programovacý jazyk na programovanie grafických efektov v počítačovej grafike. Pomocou shaderov sa dá naprogramovať efekty od jednoduchého tieňovania, cez bump mapping až po reflexiu a refrakciu materiálov.<br />
<span id="more-283"></span><br />
V prvej časti sme sa naučili špecifikovať jednotlive vrcholy primitív. Takto špecifikovane vrcholy idú následne do reťaze shaderov ktoré ich spracujú. OpenGL 4 definuje nasledovné stupne shaderov.</p>
<ul>
<li>Vertex shader</li>
<li>Tessellation control shader – core v OpenGL 4.0</li>
<li>Tessellation evaluation 	shader – core v OpenGL 4.0</li>
<li>Geometry shader – core v OpenGL 3.2</li>
<li>Fragmet shader</li>
</ul>
<p>Vstupom do tejto reťazcov ako som už povedal sú vrcholy. Výstupom sú fragmenty teda jednotlivé pixeli výsledného obrazu. Tieto shadery sa zlučujú do programov ktoré sa následne aktivujú. Jeden program môže obsahovať všetky typy shaderov alebo iba jeden vertex shader ktorý je povinný. Všetky ostatné sú nepovinné bude sa len kresliť všetko čierne. V dnešnej časti si vysvetlíme len vertex a fragment shader. Ostatné typy si necháme na inokedy.<br />
Shadery sú krátke programčeky ktoré sa vykonávajú nad jedným vrcholom v prípade vertex shadera a nad jedným fragmentom v prípade fragment shaderov. Shader sa píše v GLSL (OpenGL Shading Language). Syntaxou je veľmi podobné klasickému C. Tak ako v C sú aj GLSL základné dátové typy <em>float, int, uint, double</em>. Okrem toho sú definované aj vektorové typy týchto typov. Vektor obsahujúci float su <em>vec2, vec3 a vec4</em>. Taktiež sú definované matice <em>matN</em> a <em>matMxN</em> kde N a M sú čísla 2,3 a 4. Matica je prakticky tabuľka čísel s N krát N čísel respéktíve M stĺpcov a N riadkov. Význam matíc vysvetlím v nasledujúcej časti. Ešte spomeniem <em>ivec, uvec, bvec a dvec</em> pre deklarovanie vektorov z typov <em>int, uint, bool a double</em>.<br />
Shader sa dá rozdeliť na tri časti. Deklaráciu rozhrania, funkcie a nakoniec samotné telo shadera v main() funkcii.<br />
Teraz si ukážeme jednoduchý vertex shader. Hneď na začiatku shadera treba deklarovať verziu GLSL ktorú použijeme. Jednotlivé verzie sú nasledovné.</p>
<ul>
<li>OpenGL 3.0 – 1.30</li>
<li>OpenGL 3.1 – 1.40</li>
<li>OpenGL 3.2 – 1.50</li>
<li>OpenGL 3.3 – 3.00</li>
<li>OpenGL 4.0 – 4.00</li>
</ul>
<p>Takže v označení sa vynechá bodka a tým sa deklaruje použitá verzia. Dal som tam 1.30 aby sa to dalo spustiť aj na kartách čo podporujú len OpenGL 3.0 a oproti 4.00 nie je žiadny rozdiel. Nasleduje deklarácia rozhrania shadera. Rozhranie predstavujú premenné koré slúžia ako vstup  výstup z shadera. Ako prvá je <em>uniform float</em> premenná. Uniform premenná zostáva nemenná pre všetky vrcholy počas kreslenia. Jej hodnota sa nastavuje v OpenGL pomocou <em>glUniform{1,2,3,4}{ifd}().</em>Teda je potrebné nastaviť všetky uniform pred volaním akéhokoľvek kreslenia. Štandardne sú nastavené všetky uniform premenné na nulu.<br />
Premenné ktoré sú deklarované s kvalifikátorom <em>in</em> sú vstupné premenné do shaderu z predchádzajúcich stupňov a <em>out</em> sú zase výstupné premenné do ďalšieho stupňa.</p>
<pre><code>
<pre name="code" class="cpp">

#version 130 //verzia GLSL

uniform float mul; //uniform vstupn premenna

in vec4 in_position; //prvy vstupny atribut pozicia vrchola
in vec3 in_color; //druhy atribut farba vrchola

out vec3 color; //vystup z shadera
</pre>
<p></code></pre>
<p>Najlepšie to ozrejmí obrázok.<br />
Teraz už samotné telo shadera. To je rovnako ako v C funkcia main() ktorá nič nevracia je teda typu void a nemá žiadne parametre. Je to veľmi jednoduchý shader ktorý len prekopíruje vstupné hodnoty z vstupných premenných do výstupných. Jednou z pevne daných výstupných premenných je gl_Position ktorá je typu vec4. Je to kvôli nasledujúcim operáciám ktoré sa vykonávajú nad vrcholom ako je zostavenie primitíva, orez a  následná rasterizácia.</p>
<pre><code>
<pre name="code" class="cpp">

void main()
{
	gl_Position = in_position; //gl_Postion je deklarovany ako
							//out vec4
	color = in_color; //zapiseme farbu
}
</pre>
<p></code></pre>
<p>To bol vertex shader. Jeho výstupné premenné sú potom vstupom pre nasledujúci shader. V tomto prípade to bude fragment shader. Tieto výstupné sú potom interpolovaní naprieč celým primitívom. Ako si spomínate v prvej časti sme kreslili dva trojuholníky. V každom rohu mali inú farbu a medzi vrcholmi sa plynulo menilo z jednej farby do druhej. Táto interpolácia sa dá ovplyvniť pomocou pridania kľúčového slova pred deklaráciu vstupno/výstupnej premennej. Sú možné tri slová: <em>smooth, flat, noperspective</em>. Ak nie je uvedené žiadne berie je to rovnaké ako keby bolo uvedené <em>smooth</em>. To znamená peknú plynulú interpoláciu naprieč primitívom. <em>Flat</em> znamená žiadnu interpoláciu. To znamená že naprieč celým primitívom bude mať daná premenná hodnotu akú priradil posledný vrchol daného primitíva. Skúste si to sami a pridajte <em>flat</em> pred <em>color</em> v obidvoch shaderoch takto <em>flat vec3 color</em>. <em>Noperspective</em> podobne ako<em> smooth</em> interpoluje ale bez perspektívnej korekcie. Používa sa to ale iba málokedy.<br />
Takže teraz si ukážeme jednoduchý fragment shader. Na začiatku je zase uvedená verzi GLSL. Nasleduje deklarácia vstupných premenných. V tomto prípade iba jedna a to farba. Potom je zase telo shadera a v ňom jediný riadok v ktorom zapíšeme výslednú farbu pixela. Tú treba zase zapísať do peven danej premennej <em>gl_FragColor</em>.</p>
<pre><code>
<pre name="code" class="cpp">

#version 130

in vec3 color;

void main()
{
    gl_FragColor = vec4(color, 0.0);
}
</pre>
<p></code></pre>
<p>gl_FragColor je typu vec4 kde máme tri zložky farieb RGB (červená, zelená, modrá) a ešte A (alfu alebo aj priehľadnosť). Color sme ale deklarovali ako vec3 preto je potrebné doplniť štvrtú zložku ktorú dáme teraz nula.<br />
S vektormi sa dajú robiť rôzne operácie. Môžete pristupovať k jednotlivým zložkám vektora pomocou bodky a písmenok (x, y, z, w), (r, g, b, a), (s, t, p, q) rovnako ako sa pristupuje k prvkom štruktúry v C. Dôvod prečo sa sú tri sady je ten že to súži ako pomôcka na rozlíšenie na čo daný vektor slúži. Pre súradnice v prisestore sa používa xyzw, pre vektor reprezentujúci farbu rgba a stpq sa používa pri vektoroch reprezentujúce textúrovacie koordináty.</p>
<pre><code>
<pre name="code" class="cpp">

color.a = color.r + color.g + color.b; // scitame vsetky farby
vec2 x;
x = color.xy; //dajú sa aj takto jednoducho kombinovať.
color.rz;//CHYBA nie je možné kombinovať xyzw, rgba, stpq medzi sebou
</pre>
<p></code></pre>
<p>Ak chceme vytvoriť vektor a priradiť mu hodnotu treba na to použiť konštruktor.</p>
<pre><code>
<pre name="code" class="cpp">

vec4 a;
vec3 b;
vec2 c;
a = vec4(1.0);//všetky zložky budú rovné jednej
b = vec3(a);//štvrtá zložka sa zahodí
b = vec3(1.0, 2.0, 3.0);//b.x==1.0 b.y == 2.0 b.z == 3.0
a = vec4(1.0, b);
a = vec4(c, c);
b.w = 4.0;//CHYBA w je mimo rozsahu
</pre>
<p></code></pre>
<p>Teraz ako vytvoriť shader v OpenGL. Spravíme si na to zase triedu ktorá bude zapuzdrovať prácu s shadermi. Najprv máme mená pre jednotlivé prvky tvoriace shader. Najprv sú to podobne ako v prípade GLbuffer mená pre program obsahujúci shadery a mená pre vertex a fragment shader. Nasleduje C++ reťazec do ktorého si budeme ukladať výstup kompilátoru. Shadery treba rovnako ako C++ program preloži. Tu nám to ale preloží až prekladač v OpenGL ovládači.</p>
<pre><code>
<pre name="code" class="cpp">

class Shader
{
    GLuint program,vertex,fragment;
    string log;
</pre>
<p></code></pre>
<p>Prvé máme funkciu ktorá načíta celý obsah súboru do reťazca. Je to potrebne pretože preklad z GLSL je až za behu programu.</p>
<pre><code>
<pre name="code" class="cpp">

    string loadFile(string filename)
    {
        string ret;//retazec kam sa načíta obsah suboru
        ifstream fr(filename.c_str(), ios::in);//otvorime subor
        if(!fr.good())return ret;//nenastala chyba?
        int len;//dlzka suboru

        fr.seekg(0, ios::end);//posunieme sa na koniec suboru
        len = fr.tellg();//kolko bajtov je od zaciatku?
        fr.seekg(0, ios::beg);//zase na zaciatok
        char *data = new char[len+1];//alokujeme si buffer pre data
        fr.read(data, len);//precitame cely subor do buffera
        data[len] = 0;//na koniec pridame nulu. dost casto sa na to zabuda
        ret = data;//vlozime data do C++ retazca
        delete [] data;//uvolnime pamet
        fr.close();//zatvorime subor
        return ret;//vratime retazec
    }
</pre>
<p></code></pre>
<p>V konštruktore sa vytvorí program a k nemu prislúchajúce shadery. Tu sa dopúštam malej nepresnosti názvoslovia kedy označujem za shader vertex, fargment shader a aj cely program pozostávajúci z vertex,fragment shaderov. Postup vytvárania celého shaderu je celkom priamočiary. Najprv sa vytvorí program ku ktorému sa budú pridávať jednotlivé shadery. Do každého shaderu je potrebné nahrať zdrojový kód shaderu a ten následne kompilovať. Nakoniec sa jednotlivé shadery navzájom zlinkujú.</p>
<pre><code>
<pre name="code" class="cpp">

    public:
    Shader(string filename)
    {
        GLchar infolog[10000];//docasne ulozisko pre log
        const char *src;
        program = vertex = fragment = 0;
        program = glCreateProgram();//vytvorime program
        string vertex_source = loadFile(filename+&quot;.vert&quot;);//nacitame zdrojovy kod vertex shadera
        if(vertex_source.length())//nie je prazdny?
        {
</pre>
<p></code></pre>
<p>Na vytvorenie shadera slúži <em>glCreateShader()</em> jej parametrom je typ shadera ktorý chceme vytvoriť. Na to aby sme do shadera nahrali zdrojový kód je <em>glShaderSource()</em>. Jej prvý parameter je meno shader a do ktorého chceme nahrať kód. Druhým parametrom je počet reťazcov zdrojového kódu. To preto že tretím parametrom je pole reťazcov my ale budeme dávať iba jeden. Posledný parameter je pole na dĺžky jednotlivých reťazcov v bajtoch. Može byť NULL ak sú reťazce ukončenené znakom  ako klasický C reťazec.</p>
<pre><code>
<pre name="code" class="cpp">

            vertex = glCreateShader(GL_VERTEX_SHADER);//vytvor vertex shader
            src = vertex_source.c_str();
            glShaderSource(vertex, 1, (const GLchar**)&amp;src, NULL);//nahrajeme zdrojovy kod do shadera
</pre>
<p></code></pre>
<p>Potom sa pripojí shader k programu. Parametre sú meno programu kam sa má pripojiť ktorý shader. Potom sa skompiluje. Nakoniec sa získa výstup z kompilátora. Ten je veľmi užitočný keďže obsahuje informácie o chybách pri preklade.</p>
<pre><code>
<pre name="code" class="cpp">

            glAttachShader(program, vertex);//pripoj shader k programu
            glCompileShader(vertex);//skompiluj shader
            glGetShaderInfoLog(vertex, 9999, NULL, infolog);//ziskaj log z kompilacie
            log += infolog;//pripoj ziskany log
        }
</pre>
<p></code></pre>
<p>Potom sa pripojí shader k programu. Parametre sú meno programu kam sa má pripojiť ktorý shader. Potom sa skompiluje. Nakoniec sa získa výstup z kompilátora. Ten je veľmi užitočný keďže obsahuje informácie o chybách pri preklade.</p>
<pre><code>
<pre name="code" class="cpp">

            glAttachShader(program, vertex);//pripoj shader k programu
            glCompileShader(vertex);//skompiluj shader
            glGetShaderInfoLog(vertex, 9999, NULL, infolog);//ziskaj log z kompilacie
            log += infolog;//pripoj ziskany log
        }
</pre>
<p></code></pre>
<p>Rovnako sa postupuje aj v prípade fragment shader. Jediný rozdiel je v type vytvárnehé shaera v <em>glCreateShader()</em>.</p>
<pre><code>
<pre name="code" class="cpp">

        string fragment_source = loadFile(filename+&quot;.frag&quot;);//zopakujeme podobne aj pre fragment shader
        if(fragment_source.length())
        {
            fragment = glCreateShader(GL_FRAGMENT_SHADER);
            src = fragment_source.c_str();
            glShaderSource(fragment, 1, (const GLchar**)&amp;src, NULL);
            glAttachShader(program, fragment);
            glCompileShader(fragment);
            glGetShaderInfoLog(fragment, 9999, NULL, infolog);
            log += infolog;
        }
        glLinkProgram(program);//nakoniec treba jednotlive shadery zlinkovat dohromady
        glGetProgramInfoLog(program, 9999, NULL, infolog);
        log += infolog;
    }
</pre>
<p></code></pre>
<p>Klasický destruktor v C++. Vymaže shader ak ho už nebudme potrebovať.</p>
<pre><code>
<pre name="code" class="cpp">

    ~Shader()
    {
        //vymazeme jednotlive shadery
        glDeleteShader(vertex);
        glDeleteShader(fragment);
        glDeleteProgram(program);
    }
</pre>
<p></code></pre>
<p>Ak si spomínate v prvej časti sme definovali vstupné atribúty cez <em>glVertexAttribPointer()</em>. Jej prvým parametrom bol index. Tento index je potrebné zviazať s menom vstupnej premennej vo veretx shadery. Po nastavení je potrebne program znovu zlinkovať.</p>
<pre><code>
<pre name="code" class="cpp">

    void bindAttribLocation(GLuint index, const char *name)
    {
        glBindAttribLocation(program, index, name);//priradi meno vstupnej premennej vertex shaderu k indexu vstupneho atributu
    }
</pre>
<p></code></pre>
<p>Na čo nám slúži nasledovná metóda ktorá proste len zavolá linkvanie nad programom.</p>
<pre><code>
<pre name="code" class="cpp">

    void link()
    {
        glLinkProgram(program);//likovanie programu
    }
    string&amp; getLog(){ return log; }
</pre>
<p></code></pre>
<p>Nato aby sa shader použil pri vykresľovaní je to potrebné OpenGl povedať. Na to je glUseProgram() ktorej parameter je meno programu ktorý chceme používať. V aplikácii môžeme mať viacero shaderov ktoré budú vykreslovať rôzne objekty. Napr jeden shader bude vykreslovať terén a druhý vodu.</p>
<pre><code>
<pre name="code" class="cpp">

    void useProgram()
    {
        glUseProgram(program);//zacni pouzivat program
    }
</pre>
<p></code></pre>
<p>Na to aby sme mohli nastaviť uniform premenné je potrebné najprv získať ich lokáciu. Na to slúži  glGetUniformLocation() ktorej parametre sú meno programu a názov premennej vo forme reťazca. Tá vracia -1 pokiaľ sa daná premenná v programe nenachádza. To sa môže stať aj keď je v kóde uvedená. Ale ak sa stane že daná uniform premenná nemá vplyv na výstup tak ju kompilátor od-optimalizuje preč a teda odstráni.</p>
<pre><code>
<pre name="code" class="cpp">

    void setUniform(const char *name, float x)
    {
        GLint loc = glGetUniformLocation(program, name);//zisakj poziciu uniform premennej
        if(loc&gt;=0)glUniform1f(loc, x);//nastav jej hodnotu
    }
</pre>
<p></code></pre>
<p>Množina funkcií glUniform*() slúži na nastavovanie hodnôt uniform premenných. Číslo v názve označuje koľko zložkový vektor chceme nastaviť či obyčasjný float,int, dvoj, troj alebo štvor zložkový vektor.</p>
<pre><code>
<pre name="code" class="cpp">

    void setUniform(const char *name, float x, float y)
    {
        GLint loc = glGetUniformLocation(program, name);//zisakj poziciu uniform premennej
        if(loc&gt;=0)glUniform2f(loc, x, y);//nastav jej hodnotu
    }
</pre>
<p></code></pre>
<p>Za čislom nasleduje písmeno ktoré označuje typ premennej. Písmeno f označuje float,vecn písmeno i int, ivecn, u oznacuje uint,uvecn a nakoniec d označuje double,dvecn.</p>
<pre><code>
<pre name="code" class="cpp">

    void setUniform(const char *name, float x, float y, float z)
    {
        GLint loc = glGetUniformLocation(program, name);//zisakj poziciu uniform premennej
        if(loc&gt;=0)glUniform3f(loc, x, y, z);//nastav jej hodnotu
    }
</pre>
<p></code></pre>
<p>Úplne nakoniec sú funkcie glUniform*v() ktoré nastavujú pole uniform. Ich použitie je nasledovné <em>float c[] = {1, 2, 3, 4, 5}; glUniform1fv(program, 5, c); </em></p>
<pre><code>
<pre name="code" class="cpp">

    void setUniform(const char *name, float x, float y, float z, float w)
    {
        GLint loc = glGetUniformLocation(program, name);//zisakj poziciu uniform premennej
        if(loc&gt;=0)glUniform4f(loc, x, y, z, w);//nastav jej hodnotu
    }
};
</pre>
<p></code></pre>
<p>Na koniec initGL() pridáme nasledujúci kód. Najprv vytvoríme samotný shader zo súborov shader.vert a shader.frag. Následne priradíme index k menu vstupnej premennej. Na to je potrebné znova zlinkovať program aby sa toto priradenie prejavilo. Nakoniec povieme OpenGL že chceme daný program používať aby sme mohli nastaviť uniform premenné a vypíšeme log. To je dôležité aby bol daný shader používaný keď sa mu nastavujú uniform premenné.</p>
<pre><code>
<pre name="code" class="cpp">

        shader = new Shader(&quot;shader&quot;);
        shader-&gt;bindAttribLocation(0, &quot;in_position&quot;);
        shader-&gt;bindAttribLocation(1, &quot;in_color&quot;);
        shader-&gt;link();
        shader-&gt;useProgram();
        shader-&gt;setUniform(&quot;mul&quot;, 1.0f);
        cout &lt; &lt; &quot;=== BUILD LOG ===n&quot; &lt;getLog();
</pre>
<p></code></code></pre>
<p>Téma shaderov je obrovská a dnes zabezpečujú 80% percent grafických operácií. Dnešnou časťou sme ich len zaryli na povrchu.</p>
<p><a href="http://itklub.sk/wp-content/uploads/2010/06/lekcia-2.png"><img class="aligncenter size-medium wp-image-284" src="http://itklub.sk/wp-content/uploads/2010/06/lekcia-2-300x225.png" alt="lekcia-2" width="300" height="225" /></a><br />
<a href="http://itklub.sk/wp-content/uploads/2010/06/lekcia02tar.gz">Zdrojový kód</a></p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2010/06/10/opengl-4-core-2cast/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenGL 4 Core 1.časť</title>
		<link>http://itklub.sk/2010/01/13/opengl-34-core-1cast/</link>
		<comments>http://itklub.sk/2010/01/13/opengl-34-core-1cast/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 22:00:45 +0000</pubDate>
		<dc:creator>nou</dc:creator>
		
		<category><![CDATA[Programovanie]]></category>

		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=279</guid>
		<description><![CDATA[Prednedávnom Khronos uverejnil dve nové verzie OpenGL. Uviedol verziu číslo 4 spolu s 3.3. Štvrtá verzia je určená pre hardvér ktorý podporuje DX 11 a 3.3 prináša všetko čo podporuje DX 10 hardvér naspäť do trojkovej verzie. Na internete je dosť návodov ako programovať pod OpenGL ale väčšina používa takzvaný &#8220;intermediate&#8221; mód ktorý je ale [...]]]></description>
			<content:encoded><![CDATA[<p>Prednedávnom Khronos uverejnil dve nové verzie OpenGL. Uviedol verziu číslo 4 spolu s 3.3. Štvrtá verzia je určená pre hardvér ktorý podporuje DX 11 a 3.3 prináša všetko čo podporuje DX 10 hardvér naspäť do trojkovej verzie. Na internete je dosť návodov ako programovať pod OpenGL ale väčšina používa takzvaný &#8220;intermediate&#8221; mód ktorý je ale dnes už zastaralý a obmedzujúci vo výkone. Už OpenGL 3.0 prinieslo označovanie určitých funkcií ako zastaralé. A pretože NeHe tutoriály sú už naozaj zastaralé rozhodol som sa napísať tieto ktoré budu pokrývať funkcie ktoré sú v &#8220;core&#8221; profile OpenGL 4.<br />
<span id="more-279"></span><br />
Na začiatok si povieme čo budeme používať a teda potrebovať. Na vytvorenie OpenGL okna budeme používať knižnicu SDL <a title="stránka SDL" href="http://libsdl.org" target="_blank">http://libsdl.org/</a> a potom na Windows ešte GLEW <a href="http://glew.sourceforge.net/">http://glew.sourceforge.net/</a> ktoré nám zabezpečí načítanie všetkých rozšírení keďže na Windows je štandartne ostupné len OpenGL 1.1 a všetko ostatné je treba ručne načítavať. Ďalej program bude písaný v C++ preto je potrebná aspoň jeho základná znalosť. Ak ale ovládate C tak by ste mali byť schopný aspoň čiastočne porozumieť kódu.</p>
<p>Nebudem tu vysvetľovať ako vytvoriť projekt keďže to nie je obsahom tohto článku. Ako naištalovat SDL a ako ho používať si môžete prečítať na <a href="http://www.root.cz/clanky/sdl-hry-nejen-pro-linux-2/" target="_blank">root.cz</a>. Pri GLEW je to podobne tiež je potrebne nastaviť cesty k rozbalenému archívu ktorý obsahuje adresáre include a lib.</p>
<p>V OpenGL je potrebné všetky dáta ktoré chceme použiť pri vykresľovaní uložiť do buffer (okrem textúr ktoré sú ale tiež už len špeciálnym typom normálneho buffer). Na vytvorenie buffer nám slúži funkcia <em>glGenBuffers()</em>. Tá ma dva parametre prvým je počet buffer a druhým je pole kam sa majú uložiť vygenerované mená. Meno v OpenGL je obyčajný celo-číselný uint reprezentujúci akýkoľvek objekt v OpenGL od textúr cez VBO až po shadery.</p>
<p>Takže začneme s triedou na buffery. Tá obsahuje dve položky meno buffera a jeho typ teda cieľ kam sa bude priraďovať.</p>
<pre><code>
<pre name="code" class="cpp">

class GLbuffer
{
    GLuint buf;//obsahuje buffer
    GLenum target;//typ buffera
    public:
</pre>
<p></code></pre>
<p>V konštruktore si teda vygenerujeme jeden buffer a nastavíme cieľ kam sa bude priraďovať. Týchto cieľov je viacero a každý je parametrom pre určitú skupinu funkcií. My budeme najčastejšie používať GL_ARRAY_BUFFER. Prakticky každý objekt v OpenGL treba predtým než sa s ním začne pracovať priradiť do cieľa. Na to slúžia funkcie začínajúce na <em>glBind</em>. Následne na to každá funkcia ktorá má ako parameter cieľ pracuje s daným objektom ktorý je aktuálne priradený k danému cieľu. Priradenie k cieľom je nezávislé teda zmena jedného cieľa neovplyvní ostatné a jeden objekt môže byť priradený k viacerým cieľom naraz.</p>
<pre><code>
<pre name="code" class="cpp">

    GLbuffer(GLenum type = GL_ARRAY_BUFFER)
    {
        glGenBuffers(1, &amp;buf);//vygenerujeme si jeden buffer
        target = type;//nastavime si typ buffera. standartne to bude GL_ARRAY_BUFFER
    }
</pre>
<p></code></pre>
<p>V tejto metóde sa budu nahrávať dáta z poľa obsahujúce napríklad súradnice vrcholov do samotného buffera. Najprv teda priradíme buffer do cieľa ktorý je v tomto prípade štandardne GL_ARRAY_BUFFER. Funkcia <em>glBufferData()</em> nahráva dáta do buffera ktorý je priradený do cieľa ktorý je uvedený ako prvý parameter. Druhým parametrom je veľkosť dát v bajtoch. Tretím je ukazovateľ na samotné dáta. Ten môže byť aj NULL kedy sa vytvorí buffer o danej veľkosti len náhodnými dátami. Nakoniec naše zamýšlané použitie. Použitie je kombinácia z týchto možností. Na prvé miesto je možné dať <em>STREAM, STATIC, DYNAMIC</em>. Na druhé miesto je možné dat <em>DRAW, READ, COPY.</em> Slúži to ovládaču ako pomôcka na optimalizáciu či sa budú dáta často meniť alebo budu menené. Alebo či ich budeme používať na kreslenie alebo ako zdroj pre čitanie alebo cieľ pre zápis.</p>
<pre><code>
<pre name="code" class="cpp">

    void loadData(size_t size, void *data = NULL, GLenum usage = GL_STATIC_DRAW)
    {
        glBindBuffer(target, buf);//nastavime buffer s ktorym sa bude pracovat
        glBufferData(target, size, data, usage);//nahratie dat do buffera. data moze byt aj NULL
    }
    void bind()
    {
        glBindBuffer(target, buf);//priradenie aktivneho buffera
    }
};
</pre>
<p></code></pre>
<p>Teraz si rozoberieme druhú triedu ktorá bude obhospodarovať okno a vykresľovanie. Prvou premennou je screen ktorý ukazuje na aktuálnu obrazovku. Nasledujú dva buffery ktorú budu obsahovať súradnice vrcholov a farby jednotlivých vrcholov.</p>
<pre><code>
<pre name="code" class="cpp">

class GLwindow
{
    SDL_Surface* screen;
    GLbuffer *vbo;//buffer ktory bude obsahovat suradnice vrcholov
    GLbuffer *color;//buffer ktory bude obsahovat farby vrcholov
    bool done;//premenná ktorá sluzi na vyskocenie z nekonecnej slucky
    public:
</pre>
<p></code></pre>
<p>Konštruktor vytvorí okno čo je vďaka SDL úplne jednoduché. Tento návod si síce kladie za cieľ zoznámiť Vás s Core profilom z OpenGL 3/4. Tu spravíme prvú obchádzku v tom že SDL 1.2 podporuje len klasické vytváranie OpenGL okna ktoré vráti poslednú verziu OpenGL ktorá je kompatibilná s verziou 1.0 čo prakticky znamená kompatibilný profil. Na to aby sme dostali Core profil je potrebné použiť novšiu metódu. <em>SDL_SetVideoMode()</em> má len zopár parametrov. prvými dvoma sú šírka a výška vytvoreného okna. Tretím je bitová farebná hĺbka ktorá sa má použiť. Posledným parametrom sú príznaky mi použijeme jediný a to že chceme aby výsledné okno obsahovalo OpenGL okno. Nasleduje nastavenie titulka okna. <em>glewInit()</em> inicializuje všetky rozšírenia ktoré podporuje aktuálne OpenGL na ktorom beží program. Na Linuxe je definované makro ktoré toto volanie odstráni keďže nie je nutné tak ako cele GLEW. Nakoniec sa inicializuje samotné OpenGL.</p>
<pre><code>
<pre name="code" class="cpp">

    GLwindow()
    {
        screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL);//jednoduche vytvorenie okna za pomoci SDL
        SDL_WM_SetCaption(&quot;Lekcia 1&quot;, NULL);
        glewInit();
        done = false;//este sme neskoncily
        initGL();//nastavime vsetko potrebne na zaciatok
    }
</pre>
<p></code></pre>
<p>V inicializácii OpenGL robíme zatiaľ minimum vecí. Prvou vecou je nastavenie rozmerov viewportu. To znamená x,y súradnice dolného ľavého rohu a pravého horného v pixeloch. Nasleduje nastavenie Vertex Array Object. O tom niekedy v budúcnosti teraz len poviem že to obaľuje nastavovanie okolo vertex bufferov.</p>
<pre><code>
<pre name="code" class="cpp">

    void initGL()
    {
        glViewport(0, 0, WIDTH, HEIGHT);

        GLuint vao;//VAO alebo Vertex Array Object zapuzruju vsetky nastavenia spojene s definovanim vrcholov
        glGenVertexArrays(1, &amp;vao);//core profil vyzdauje aby jeden VAO bol vytvoreny.
        glBindVertexArray(vao);//priradime tento VAO a uz sa nestarame
</pre>
<p></code></pre>
<p>Tu si vytvoríme dva buffery. Teda sa dvakrat zavolá <em>glGenBuffer()</em> v konštruktore triedy GLbuffer. Následne sa nahrajú naše dáta. Sú to obyčajné pole float. Každá trojica čísel predstavuje dáta pre jeden vrchol. V prvom poli sú to súradnice x,y,z v 3D priestore. Druhé pole obsahuje farby pre každý vrchol. Sú to klasické farebne zložky RGB modelu kedy je farba zložená z troch základných farieb červenej, zelenej a modrej. Budeme kresliť trojuholníky teda tri trojice ktoré sú na jednom riadku predstavujú vrcholy jedného trojuholníka. Potom sa zavolá metóda <em>loadData()</em> v ktorej sa buffer priradí do cieľa a následne zavola <em>glBufferData()</em>. Ako je vidno posielame veľkosť poľa a samotné pole.</p>
<pre><code>
<pre name="code" class="cpp">

        vbo = new GLbuffer;
        color = new GLbuffer;
        float vertexs[] = {-0.95f, -0.95f, 0.0f,  0.95f, -0.95f, 0.0f, -0.95f, 0.9f, 0.0f,
            -0.95f, 0.95f, 0.0f,  0.95f, -0.9f, 0.0f,  0.95f, 0.95f, 0.0f };
        float colors[] = {1.0f, 0.0f, 0.0f,  0.0f, 1.0f, 0.0f,  0.0f, 0.0f, 1.0f,//cervena zelena modra
        1.0f, 1.0f, 0.0f,  1.0f, 0.0f, 1.0f,  0.0f, 1.0f, 1.0f};//zlta purpurova tyrkysova
        vbo-&gt;loadData(sizeof(vertexs), vertexs);
        color-&gt;loadData(sizeof(colors), colors);
</pre>
<p></code></pre>
<p>Tu je za-komentovaný &#8220;správny&#8221; postup ako špecifikovať ktoré vrcholy sa majú kresliť. Správny v tom že nižšie ukážem zastaralý spôsob ktorý už nie je v Core profile. Tento zastaralý spôsob použijem preto aby sme už v tejto časti dostali nejaký výstup. Vstupom pre kreslenie v OpenGL sú vrcholy jednotlivých primitív. primitíva sú body, čiary, trojuholníky, štvorce, polygóny a v najnovšom OpenGL 4 aj patches (ktoré sa nakoniec ale aj tak transformujú na skôr spomenuté primitíva). Pre každý vrchol treba určiť jeho polohu, farbu, textúrovacie koordináty a iné. Na to slúžia vstupné atribúty. V OpenGL je ich dostupných hneď niekoľko. My budeme zatiaľ definujeme dva atribúty a to polohu a farbu. Tieto vstupné atribúty sú identifikované indexmi od 0 až po GL_MAX_VERTEX_ATTRIBS-1. Na dnešnom hardvére to je maximálne 16 atribútov. Aby sa dáta z daného vstupu používali treba ho zapnúť. Na to slúži <em>glEnableVertexAttribArray()</em> ktorej parametrom je index atribútu ktorý chceme zapnúť. Následne priradíme do GL_VERTEX_ARRAY buffer s súradnicami vrcholov. Nezabudnime že pri vytváraní bufferov sa nastavil práve tento cieľ do premennej <em>GLbuffer::target</em> aby sa následne použil aj pri ostatných volaniach. Funkcia <em>glVertexAttribPointer()</em> určuje formát dát ktoré sú v buffery. Priradí buffer aktuálne priradený do GL_VERTEX_ARRAY ako vstupné dáta atribútov. Prvým parametrom je index atribútu ku ktorému sa má priradiť. Druhý je počet zložiek pre jeden vrchol. Môže to byť jedna až štyri. V našom prípade máme troj-zložkovú polohu. Ďaľsí parameter určuje typ dát ktoré posielame. Posielame float teda použijeme GL_FLOAT. Môžné hodnoty sú ešte GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT a GL_DOUBLE. Posledné dva parametre sú krok a odskok v bajtoch. Odskok a krok sa nastavuje vtedy ak by sme mali jeden buffer obsahujúci viacero atribútov ktoré by boli prekladané. Napríklad by bola v poli najprv trojica čísel označujúca polohu prvého vrcholu nasledovala by trojica čísel určujúca farbu prvého vrchola. Za nimi by bol určený druhý vrchol atď. Vtom prípade sa nastaví krok na počet bajtom medzi jednotlivými vrcholmi teda 6*sizeof(float) kedže jeden vrchol tvorí šesť float. Odskok určuje kde začínajú dáta atribútu. Pre farbu by to bolo teda 3*sizeof(float) kedže farba začína až za troma float. Ešte zopakujeme pre farbu len dáme druhy index.</p>
<pre><code>
<pre name="code" class="cpp">

        /*
        glEnableVertexAttribArray(0);//zapne prve pole s atributmi
        vbo-&gt;bind();//priradi aktualny buffer
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);//nastavy zdroj pre dene pole atributov

        glEnableVertexAttribArray(1);//zapnneme druhe pole
        color-&gt;bind();//priradim si buffer s farmabmi
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);//nastavim aby sa z aktualne priradeneho buffera braly data
        */
</pre>
<p></code></pre>
<p>Tu je starý spôsob ktorý sa používal v OpenGL 2.1 a skorších. Je to prakticky to isté. Jediný rozdiel je v tom že namiesto indexov boli pevne dané vstupy ktoré mali pevne udaný spôsob použitia. Na to aby ale hore uvedený spôsob fungoval musíme mať aktívne shadery. Čo je druhá obchádzka ktorú použijem a tou je fixná pipeline bez shaderov.</p>
<pre><code>
<pre name="code" class="cpp">

        glEnableClientState(GL_VERTEX_ARRAY);
        vbo-&gt;bind();
        glVertexPointer(3, GL_FLOAT, 0, 0);

        glEnableClientState(GL_COLOR_ARRAY);
        color-&gt;bind();
        glColorPointer(3, GL_FLOAT, 0, 0);
    }
</pre>
<p></code></pre>
<p>Teraz máme nastavené vstup pre samotné kreslenie. Kreslenie nám zabezpečí metóda draw(). Na začiatku vymažeme obrazovku aby na nej nič nebolo. Potom nám vykreslí dva trojuholníky funkcia <em>glDrawArrays()</em>. Jej prvý parameter určuje čo za primitívum chceme kresliť teda trojuholníky. Ešte máme dostupné napr. GL_QUADS, GL_POINTS, GL_LINES. Druhý parameter je číslo vrcholu od ktorého sa má začať kresliť. Počet určuje počet vrcholov ktoré sa majú spracovať. Vykreslí sa len toľko vrcholov koľko vytvorí celé primitívum. Teda ak zadáme napríklad 4 vykreslí sa len jeden trojuholník keďže sa dokáže skompletizovať len jeden. Potom sa už len skontroluje či nenastala niekde chyba. OpenGL je veľmi robustné a teda volania s nesprávnymi hodnotami sú ignorované. Výnimku tvoria volania ako sú <em>glBufferData()</em> kam sa posiela adresa do pamäte kde sa nedá ošetriť chyba a program dokáže spadnúť. Inak by sa nič nemalo diať okrem toho že sa niekedy nedeje nič pretože je niečo zle. Nakoniec prehodíme vykreslený obraz aby sa zobrazil na obrazovku. Kreslí sa na striedačku do dvoch obrazov aby sa zamedzilo blikaniu pri kreslení. To bolo v minulosti spôsobené tým že sa vymazala obrazovka a grafická karta následne začala vykreslovať na obrazovku takže ste mohli sledovať ako pribúdajú jednotlivé trojuholníky. Dnes sa ale už štandardne používa dvojitý buffering niekedy aj trojitý.</p>
<pre><code>
<pre name="code" class="cpp">

    void draw()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        //samotne kreslenie stvorcov.
        glDrawArrays(GL_TRIANGLES, 0, 6);

        getGLError();
        SDL_GL_SwapBuffers();
    }
</pre>
<p></code></pre>
<p>Zostáva už len posledné dve metódy. Prvá <em>run</em> nie je nič iné ako nekonečná slučka ktorá volá dookola spracovanie prichádzajúcich správ a vykresľovanie. Druhá je samotné spracovanie správ kedy sa kontroluje či sa nestlačil escape aby sa program ukončil</p>
<pre><code>
<pre name="code" class="cpp">

    void run()
    {
        while(!done)//nekonecna slucka
        {
            processEvents();//spracujeme udalosti
            draw();//vykreslime obraz
        }
    }
    void processEvents()
    {
        SDL_Event event;
        while(SDL_PollEvent(&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;event))
        {
            switch (event.type)
            {
                case SDL_QUIT://prisla sprava na ukoncenie. pouzivatel teda klikol na zatvorenie okna
                    done = true;//nastavime na true aby slucka skoncila
                    break;
                case SDL_KEYDOWN://bola stlacena klavesa
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE://a je to escape
                            done = true;
                            break;
                        default:break;
                    }
                    break;
            }
        }
    }
};
</pre>
<p></code></pre>
<p>V samotnej <em>main()</em> sa už len inicializuje samotné SDL a vytvorí GLwindow.</p>
<pre><code>
<pre name="code" class="cpp">

int main ( int argc, char** argv )
{
    SDL_Init(SDL_INIT_VIDEO);
    atexit(SDL_Quit);

    GLwindow window;
    window.run();

    return 0;
}
</pre>
<p></code></pre>
<p>Nakoniec tu máme zdrojové kódy na stiahnutie. Pre Windows je to projekt pre Visual Studio 2005 EE a pre linux klasické Makefile. Ako som už povedal pre na Windowse budete potrebovať mať nainštalované okrem VS spolu s PSDK aj SDL a GLEW a nastavené cesty. Na Linuxe stačí nainštalovať vývojársky balíček s SDL. GLEW nie je potrebné.<br />
<a href="http://itklub.sk/wp-content/uploads/2010/01/lekcia01.zip">Zdrojový kód Windows</a><br />
<a href="http://itklub.sk/wp-content/uploads/2010/01/lekcia01tar.gz">Zdrojový kód Linux</a></p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2010/01/13/opengl-34-core-1cast/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Prehľadávanie pdf skriptom v Linuxe 2</title>
		<link>http://itklub.sk/2010/01/08/prehladavanie-pdf-skriptom-v-linuxe-2/</link>
		<comments>http://itklub.sk/2010/01/08/prehladavanie-pdf-skriptom-v-linuxe-2/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 21:26:50 +0000</pubDate>
		<dc:creator>gautuma</dc:creator>
		
		<category><![CDATA[Nezaradené]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=276</guid>
		<description><![CDATA[



V predchádzajúcom článku som ukázal skript na prehľadávanie pdf.
Avšak obsahoval nejaké chyby.
Pokúsil som sa ich opraviť. Tu je výsledok:




#!/bin/bash
if [ -z "$2" ]
   then
   echo "Usage: pdfsearch path [\"]phraze[\"]"
   exit
fi

if [ "`ls -la $1 &#124; grep pdf$ &#124; wc -l`" == "0" ]
   then
   echo [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td><a href="http://itklub.sk/wp-content/uploads/2009/12/sha-bang_small.png"><img class="size-full wp-image-275 alignleft" src="http://itklub.sk/wp-content/uploads/2009/12/sha-bang_small.png" alt="#! in terminal" width="64" height="52" /></a></td>
<td>
V predchádzajúcom článku som ukázal skript na prehľadávanie pdf.<br />
Avšak obsahoval nejaké chyby.<br />
Pokúsil som sa ich opraviť. Tu je výsledok:
</td>
</tr>
</table>
<p><span id="more-276"></span></p>
<pre style="font-size:12px;border: 1px solid #000000; padding: 0.05cm; background: #eeeeee none repeat scroll 0% 0%; margin-left: 0.2cm; margin-right: 0.2cm; margin-bottom: 0cm; page-break-before: auto;font-family: FreeMono,monospace;">#!/bin/bash
if [ -z "$2" ]
   then
   echo "Usage: pdfsearch path [\"]phraze[\"]"
   exit
fi

if [ "`ls -la $1 | grep pdf$ | wc -l`" == "0" ]
   then
   echo "Path has no pdf files";
   exit
fi

FILES="$1/*.pdf";
for file in $FILES
   do
   echo $file
   pdftotext $file - | grep -n -i --color "$2"
   echo
done</pre>
<p>Nezabudnite na koniec skriptu vložiť prázdy riadok.</p>
<p>Pribudol druhý if, ktorý zisťuje či sa v danej ceste nachádzajú pdf súbory.<br />
Ak ich počet je rovný 0 tak vypíše hlášku a skript sa ukončí.</p>
<p>Ďalej som pridal prepínač -i a &#8211;color .</p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2010/01/08/prehladavanie-pdf-skriptom-v-linuxe-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Prehľadávanie pdf skriptom v Linuxe</title>
		<link>http://itklub.sk/2009/12/28/prehladavanie-pdf-skriptom-v-linuxe/</link>
		<comments>http://itklub.sk/2009/12/28/prehladavanie-pdf-skriptom-v-linuxe/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 11:38:13 +0000</pubDate>
		<dc:creator>gautuma</dc:creator>
		
		<category><![CDATA[Linux/Unix]]></category>

		<category><![CDATA[Produktivita]]></category>

		<category><![CDATA[Programovanie]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=272</guid>
		<description><![CDATA[Skript na prehľadávanie viacerých pdf v UNIX(like) systémoch.]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td><a href="http://itklub.sk/wp-content/uploads/2009/12/sha-bang_small.png"><img class="size-full wp-image-275" src="http://itklub.sk/wp-content/uploads/2009/12/sha-bang_small.png" alt="#! in terminal" width="64" height="52" /></a></td>
<td>Stalo sa mi, že som potreboval nájsť určitú &#8220;textovú frázu&#8221; vo viacerých pdf súboroch.<br />
Keďže som &#8220;správne&#8221; lenivý, nechcelo sa mi ich po jednom otvárať a hľadať (Ctrl+f).<br />
Pohľadal som si na internete skript, ktorý som si trocha upravil(keďže mi nefungoval).</td>
</tr>
</tbody>
</table>
<p><span id="more-272"></span><br />
Originálna stránka je:</p>
<p><a href="http://ubuntuforums.org/archive/index.php/t-13665.html" target="_blank">http://ubuntuforums.org/archive/index.php/t-13665.html</a></p>
<p>Toto je upravený skript:</p>
<pre style="font-size:12px;font-family:monospace;">
<span style="color: #3366ff;">#!/bin/sh</span>
<span style="color: #808000;">if [ -z <span style="color: #000080;">"$2"</span> ]
then
echo "</span><span style="color: #ff0000;">Usage:  pdfsearch path [<span style="color: #000080;">\"</span>]phraze[<span style="color: #000080;">\"</span>]</span><span style="color: #808000;">"
exit
fi</span>

<span style="color: #33cccc;">FILES</span>="<span style="color: #000080;">$1</span><span style="color: #ff0000;">/*.pdf</span>"
<span style="color: #808000;">for</span> file <span style="color: #808000;">in</span> <span style="color: #000080;">$FILES</span>
<span style="color: #808000;">do</span>
<span style="color: #808000;">echo </span><span style="color: #000080;">$file</span>
pdftotext <span style="color: #000080;">$file</span> - <span style="color: #808000;">|</span> grep <span style="color: #808000;">-n </span><span style="color: #808000;">"$2"</span>
<span style="color: #808000;">echo
done</span>
</pre>
<p>Pre správne použitie skopírujte text skriptu do súboru s názvom napríklad pdfsearch.<br />
Spravte z neho spustiteľný súbor</p>
<p><code><span style="color: #808000;"><span style="color: #000000;">chmod u+x pdfsearch</span><br />
</span></code></p>
<p>A spustite nasledovným príkazom:</p>
<p><code><span style="color: #808000;"><span style="color: #000000;">./pdfsearch &lt;cesta/ku/pdf/suborom&gt; &#8220;hladana fraza&#8221;<br />
</span></span></code></p>
<p>Je potrebné aby ste mali na vašom systéme program pdftotext, ktorý konvertuje pdf na plain text.<br />
Ako shell som predpokladal bash, alebo jeho modifikácie.</p>
<p>V originálnom článku bol použitý program pdf2text čo nie je veľký rozdiel.<br />
Tu som ešte zmenil prehľadávanie tak aby nevytváral .txt súbory (druhý parameter <strong>-</strong>).</p>
<p>Pridal som úvodzovky pre grep aby sa dali vyhľadávať aj cele frázy s medzerami.Môžete si pridať aj farebné zvýraznenie prepínačom grepu &#8211;color (dve pomlčky).</p>
<p>Skript pracuje tak, že zobrazí každé prehľadávané pdf (aj keď v ňom nič nenájde).<br />
Ak v ňom nájde hľadanú frázu, tak zobrazí celý riadok kde sa vyskytla (farebne vyznačí číslo riadku a frázu).</p>
<p>Skript sa dá jednoducho (dúfam) rozšíriť pre vaše potreby.</p>
<p>Ak chcete, môžete do komentárov napísať nejaké zlepšenie <img src='http://itklub.sk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2009/12/28/prehladavanie-pdf-skriptom-v-linuxe/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Vim editor</title>
		<link>http://itklub.sk/2009/12/23/vim-editor/</link>
		<comments>http://itklub.sk/2009/12/23/vim-editor/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 23:20:57 +0000</pubDate>
		<dc:creator>gautuma</dc:creator>
		
		<category><![CDATA[Produktivita]]></category>

		<category><![CDATA[Programovanie]]></category>

		<category><![CDATA[Vývoj a dizajn]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=227</guid>
		<description><![CDATA[editor vim - tipy a triky]]></description>
			<content:encoded><![CDATA[<p><a href="http://itklub.sk/wp-content/uploads/2008/11/vim-editor_logo.png"><img class="alignleft size-thumbnail wp-image-228" src="http://itklub.sk/wp-content/uploads/2008/11/vim-editor_logo-150x150.png" alt="" width="85" height="85" /></a></p>
<p style="padding-left: 30px;">Vi(m) editor je uznávaným editorom napríklad medzi programátormi.</p>
<p style="padding-left: 30px;">Pomáha automatizovať rutinné úpravy textu.</p>
<p style="padding-left: 30px;">Podporuje regulárne výrazy a najrôznejšie kombinácie všetkých príkazov.</p>
<p style="padding-left: 30px;"><span id="more-227"></span></p>
<p style="padding-left: 30px;">
<p>Vitajte v prvom článku o vim-e <img src='http://itklub.sk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Budem sa ho snažiť udržiavať čo najstručnejší a zároveň prehľadný(podľa možností), aby sa dal rýchlo prečítať.<br />
Kým začnete: Pre úplné začiatky vo vim-e odporúčam: <a href="http://www.kit.tul.cz/~satrapa/docs/vim/">Satrapova stránka o vim(po česky)<br />
</a>Prvá otázka ktorá Vás možno napadne: &#8220;<em>Načo je vim dobrý?</em>&#8221;<br />
Je dobrý predovšetkým na rýchle vkladanie a úpravu textu.<br />
(na čo nie je:) Neslúži však na dizajn, tj. upravuje sa iba plain text.<br />
Napríklad pri písaní skriptov alebo programov v programovacom jazyku.</p>
<p>Veľmi ľahko sa pomocou rôznych konštrukcií vykonajú akcie, ktoré by bolo potrebné viacnásobne opakovať.<br />
Je dobré mať po ruke zoznam používaných príkazov. Sú nutné na bežné jednoduché používanie.<br />
Budem sa ich snažiť zoradiť podľa frekventovanosti používania.</p>
<p><em>, oddeľujem viac samostatných príkazov<br />
^+&lt;znak&gt; znamená Control/Ctrl + niečo</em></p>
<p>Najprv základné riadkové príkazy<em>:</em></p>
<table style="height: 64px;" border="0" width="269">
<tbody>
<tr>
<td><strong>:q!</strong></td>
<td>Ukončenie editora bez uloženia zmien</td>
</tr>
<tr>
<td><strong>:w</strong></td>
<td>Uložiť zmeny</td>
</tr>
<tr>
<td><strong>:wq</strong></td>
<td>Ukončenie editora s uložením zmien</td>
</tr>
</tbody>
</table>
<p>A editačné príkazy:</p>
<table style="height: 546px;" border="0" width="611">
<tbody>
<tr>
<td><strong>&lt;Esc&gt;<br />
</strong></td>
<td>prechod do príkazového módu</td>
</tr>
<tr>
<td><strong>a,i</strong></td>
<td><strong>a</strong><em>ppend/</em><strong>i</strong><em>nsert</em> = vkladať text za/pred aktuálne písmeno</td>
</tr>
<tr>
<td><strong>o,O</strong></td>
<td>vložiť text na začiatok nasledujúceho/predchádzajúceho riadku</td>
</tr>
<tr>
<td><strong>A,I</strong></td>
<td>vkladať text za/pred posledné/prvé písmeno celého riadku</td>
</tr>
<tr>
<td><strong>x,X</strong></td>
<td>vymazať jeden znak, ako klávesy Delete/Backspace</td>
</tr>
<tr>
<td><strong>dd, D</strong></td>
<td>vymazanie aktuálneho riadku(ekvivalentné dd==D)</td>
</tr>
<tr>
<td><strong>yy, Y</strong></td>
<td>skopírovanie aktuálneho riadku(yy==Y)</td>
</tr>
<tr>
<td><strong>w,b,e</strong></td>
<td>presúvať sa po slovách (oddeľovač je akýkoľvek znak okrem [a-zA-Z] )<br />
<strong>w</strong> = presun dopredu, <strong>b</strong> = presun dozadu, <strong>e</strong> = na koniec slova a potom na koniec  každého ďalšieho slova (ako Ctrl+šípky v obyčajnom editore)</td>
</tr>
<tr>
<td><strong>W,B,E</strong></td>
<td>to isté čo <strong>w,b,e</strong> ale oddeľovač je len prázdny znak(čiže sa preskočí ďalej)</td>
</tr>
<tr>
<td><strong>u,^+r</strong></td>
<td><strong>u</strong><em>ndo/</em><strong>R</strong><em>edo </em>krok späť/dopredu v histórii upravovania(podobne ako Ctrl+z a Ctrl+y v iných aplikáciách)</td>
</tr>
<tr>
<td><strong>d</strong></td>
<td><strong>d</strong><em>elete</em> = špeciálny príkaz na mazanie, ktorý sa spája s pohybovým príkazom (napr <strong>d</strong>+šípka )</td>
</tr>
<tr>
<td><strong>y</strong></td>
<td><strong>y</strong><em>ank</em> = kopírovanie, použitie podobne ako <strong>d</strong></td>
</tr>
<tr>
<td><strong>D,Y</strong></td>
<td><strong>D</strong> vymaže text od aktuálnej pozície do konca riadku,<strong>Y</strong> skopíruje aktuálny riadok</td>
</tr>
<tr>
<td><strong>p,P</strong></td>
<td>vkladanie;Vkladá sa to čo sa vymazalo pomocou príkazov <strong>d</strong>,<strong>x</strong>,<strong>y</strong> ;<strong><br />
P</strong> = vlož pred písmeno/riadok (podľa toho čo bolo skopírované znaky/riadok)<br />
<strong>p</strong> = vlož za písmeno/riadok</td>
</tr>
<tr>
<td><strong>.</strong></td>
<td>opakovanie poslednej sekvencie príkazov</td>
</tr>
<tr>
<td><strong>%<br />
</strong></td>
<td>presunutie sa na spárovanú zátvorku (pre programátorov v C,Java..)</td>
</tr>
<tr>
<td><strong>v,V</strong></td>
<td>vaseline mód,slúži na vyznačenie textu; po stlačení <strong>v</strong>/<strong>V</strong> následujú pohybové príkazy(šípky..);<br />
<strong>V</strong> sa označuje po celých riadkoch; <strong>v</strong> tiež ale označovať sa dá aj v rámci riadku</td>
</tr>
<tr>
<td><strong>gg,G</strong></td>
<td>presun na prvý/posledný riadok súboru</td>
</tr>
<tr>
<td><strong> 1,2..</strong></td>
<td>stlačenie akéhokoľvek čísla <strong>n</strong> (aj 43) pred požadovaným príkazom znásobí daný príkaz <strong>n</strong>-krát</td>
</tr>
<tr>
<td><strong>h</strong>,<strong>j</strong>,<strong>k</strong>,<strong>l</strong></td>
<td>pohyb kurzoru vľavo,dole,hore,vpravo (v niektorých verzách nefungujú šípky)</td>
</tr>
<tr>
<td><strong>=</strong></td>
<td>usporiadanie textu ako kód v jazyku C (podľa zátvoriek &#8220;{}&#8221;)</td>
</tr>
<tr>
<td><strong>&gt;&gt;</strong>,<strong>&lt;&lt;<br />
</strong></td>
<td>posun riadku o odsek doprava/doľava</td>
</tr>
<tr>
<td><strong>^,$</strong></td>
<td>presunúť sa na prvé/posledné písmeno v riadku (^ v tomto prípade znamená znak &#8216;^&#8217; bežne nad kláv.<strong>6</strong>)</td>
</tr>
<tr>
<td><strong>^+v</strong></td>
<td>štvorcové označenie bloku textu</td>
</tr>
</tbody>
</table>
<p>Väčší zoznam je napríklad tu:<br />
<a href="http://www.tuxfiles.org/linuxhelp/vimcheat.html" target="_self">http://www.tuxfiles.org/linuxhelp/vimcheat.html</a></p>
<p>Po strávení tejto tabuľky sa môžete v ďalších dieloch dočítať:</p>
<ul>
<li>nahradzovanie textu</li>
<li>makrá</li>
<li>regulárne výrazy</li>
<li>a iné samé dobré veci</li>
</ul>
<p>Medzičasom sa môžete prehrabávať v tomto rozsiahlejšom článku :<br />
<a href="http://www.yolinux.com/TUTORIALS/LinuxTutorialAdvanced_vi.html" target="_blank">http://www.yolinux.com/TUTORIALS/LinuxTutorialAdvanced_vi.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2009/12/23/vim-editor/feed/</wfw:commentRss>
		</item>
		<item>
		<title>O tom, prečo sa použitie bing rozmáha</title>
		<link>http://itklub.sk/2009/10/31/o-tom-preco-sa-pouzitie-bing-rozmaha/</link>
		<comments>http://itklub.sk/2009/10/31/o-tom-preco-sa-pouzitie-bing-rozmaha/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:27:51 +0000</pubDate>
		<dc:creator>marcello</dc:creator>
		
		<category><![CDATA[Nezaradené]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=268</guid>
		<description><![CDATA[Tento článok neobsahuje veľa poučných informácii, ale cítil som, že ho musím napísať po posledných skúsenostiach s jedným OS. Pokiaľ nemáte chuť čítať sťažnosti, varoval som vás.
Ak sa vo svete internetu aspoň trocha pohybujete, alebo ste používateľom OS Windows, je dosť možné, že ste sa s týmto vyhľadávačom už stretli. V nasledujúcich pár riadkoch by [...]]]></description>
			<content:encoded><![CDATA[<p>Tento článok neobsahuje veľa poučných informácii, ale cítil som, že ho musím napísať po posledných skúsenostiach s jedným OS. Pokiaľ nemáte chuť čítať sťažnosti, varoval som vás.<span id="more-268"></span></p>
<p>Ak sa vo svete internetu aspoň trocha pohybujete, alebo ste používateľom OS Windows, je dosť možné, že ste sa s týmto vyhľadávačom už stretli. V nasledujúcich pár riadkoch by som chcel vyjadriť názor, prečo si myslím, že sa použitie tohoto vyhľadávača zvyšuje a prečo je to podľa mňa veľmi nečestné.</p>
<h3>Krátky príbeh, ktorý kto nepozná, spozná</h3>
<p>Jedného dňa zapnete Internet explorer a zrazu sa &#8220;automaticky&#8221; zmení nami nastavená vyhľadávacia stránka na bing. Prečo sa to automaticky stane a OS sa ma na túto zmenu aspoň nespýta? Internet explorer má bing, príbeh pokračuje. Nainštaloval som si Google Chrome, tak som sa tešil, že aspoň tam budem mať svoj obľúbený vyhľadávač. Dobrá nálada dlho netrvá, Windows mi po reštarte &#8220;automaticky&#8221; zasa strčí prsty do nastavenia iného prehliadača a ponúka aj v Chrome vyhľadávač bing. Podobne automatická inštalácia nebezpečného doplnku do Firefoxu. Win proste vie, čo používateľ chce(ironicky).</p>
<p>Čo to má vlastne znamenať??? Už len neželaná reklama tejto spoložnosti mi vadí, nie to ešte &#8220;automatické&#8221; zmenenie, čo som sám osobne zmenil. Za tento OS sa platí a ešte za to chrlí neželanou reklamou a obmedzuje používateľa vnucovaním ich technológii. Hovorí sa zákazník, náš pán. Nie ale všade to platí a tu je to zjavné porušenie pravidiel slušnosti a vidieť silnú monopolistickú politiku. A aby to nestačilo, v slávnom IE sa vôbec nedá triviálne zmeniť vyhľadávač spať na google. Dôvod, prečo to vravím je, že vačšina užívateľov vie prehliadač používať, ale ešte v živote ho nenastavovali a všetko nechávajú na default nastavenia a keď chcú, tak to aj tak nevedia zmeniť. Preto je Bing taký známy, hneď nahradil Live search a tiež yahoo.</p>
<h3>Slová na záver</h3>
<p>Bolo by dobré dať používateľovi možnosť výberu.<br />
Keď už, tak by bolo vhodné sa spýtať používateľa, či by si náhodou nechcel dať ich vyhľadávač.<br />
Ak používateľ povie, že nie, tak NIE.</p>
<p>Zaujíma ma aj váš názor a kľudne napíšte, čo si o tom myslíte.</p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2009/10/31/o-tom-preco-sa-pouzitie-bing-rozmaha/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kompilácia programov v qt 4.5 pod Ubuntu</title>
		<link>http://itklub.sk/2009/09/03/qt-45-in-ubuntu-doesnt-compile/</link>
		<comments>http://itklub.sk/2009/09/03/qt-45-in-ubuntu-doesnt-compile/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 16:01:18 +0000</pubDate>
		<dc:creator>marcello</dc:creator>
		
		<category><![CDATA[Linux/Unix]]></category>

		<category><![CDATA[Programovanie]]></category>

		<category><![CDATA[lib]]></category>

		<category><![CDATA[qt]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://itklub.sk/?p=264</guid>
		<description><![CDATA[Už minule som si stiahol najnovšie qt zo stránky vývojárov, ale po nainštalovaní nešlo kompilovať ani len príklady. Prvýkrát som manuálne pridal linky na požadované libky a hneď to išlo. Tentokrát som ale lenivý a spravil som na to skript, takže po jeho spustení všetko funguje, ako má. Použitie je veľmi jednoduché.Popis
Skript je pekne komentovaný [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-265" src="http://itklub.sk/wp-content/uploads/2009/09/qt-logo-new.png" alt="qt-logo-new" width="70" height="70" /><img class="alignnone size-full wp-image-266" src="http://itklub.sk/wp-content/uploads/2009/09/vs-logo.jpg" alt="vs-logo" width="42" height="37" /><img class="alignnone size-full wp-image-267" src="http://itklub.sk/wp-content/uploads/2009/09/ubuntu-logo.jpg" alt="ubuntu-logo" width="74" height="70" />Už minule som si <a title="QT download" href="http://qt.nokia.com/products/" target="_blank">stiahol najnovšie qt</a> zo stránky vývojárov, ale po nainštalovaní nešlo kompilovať ani len príklady. Prvýkrát som manuálne pridal linky na požadované libky a hneď to išlo. Tentokrát som ale lenivý a spravil som na to skript, takže po jeho spustení všetko funguje, ako má. Použitie je veľmi jednoduché.<span id="more-264"></span>Popis</p>
<p>Skript je pekne komentovaný a dúfam, že aj dostatočne bezpečný, takže by vám nemal nič pokaziť (mne nepokazil <img src='http://itklub.sk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) Ak nájdete chybu, alebo vylepšenie, napíšte to do komentára. Ďakujem.</p>
<h3>Usage:</h3>
<p>Stáčí ako bežne</p>
<pre>chmod u+x subor.sh
sudo ./subor.sh</pre>
<h3>Samotný skript:</h3>
<pre>#!/bin/bash

#creates lib dependencies for QT or
# if you like, also lib dependencies for other programs, if you customize $libs variable
# author: Marcel Kanta
# licence: LGPL like QT 4.5

path="/usr/lib/" # change if you have to, or try default

#insert your required libraries from Compile Output, or shell query
libs='-lfreetype -lgobject-2.0 -lSM -lICE -pthread -pthread -lXrender -lfontconfig -lXext -lX11 -lQtCore -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread'

# dont't change anything under this line, only if you know,
# what you are doing.
#----------------------------------------------------------------

echo $libs |sed 's/-l/\n-l/g'|grep "^-l"|colrm 1 2|cut -d " " -f 1| while read f; do
	# here we have list of libs in format like "libfreetype"
	# here we check if the lib exist and if the answer is yes and
	# there doesn't exist .so extention, it creates a link.
	#it's rather safe.
	for i in $(seq 9 -1 0); do
		if [ -e $path"lib$f.so.$i" ]; then
			if [ ! -e $path"lib$f.so" ]; then
				echo $f to do;
				ln -s $path"lib"$f.so.$i $path"lib"$f.so;
				# what and where
			fi;
			continue;
		fi;
	done
done;</pre>
<h3>English version:</h3>
<p>quick fix: see code above <img src='http://itklub.sk/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://itklub.sk/2009/09/03/qt-45-in-ubuntu-doesnt-compile/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
