<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JeGX&#039;s HackLAB &#187; OpenGL</title>
	<atom:link href="http://www.ozone3d.net/blogs/lab/category/tech/opengl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ozone3d.net/blogs/lab</link>
	<description>Pixel hacking, prog 3D et autres bizarreries</description>
	<lastBuildDate>Tue, 13 Dec 2011 16:25:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Les Cartes GeForce et le keyword GLSL Precise</title>
		<link>http://www.ozone3d.net/blogs/lab/20110923/les-cartes-geforce-et-le-keyword-glsl-precise/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20110923/les-cartes-geforce-et-le-keyword-glsl-precise/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 11:29:56 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Pixel Hacking]]></category>
		<category><![CDATA[Tools de JeGX]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[glsl]]></category>
		<category><![CDATA[msi kombustor]]></category>
		<category><![CDATA[precise]]></category>
		<category><![CDATA[shadow mapping]]></category>
		<category><![CDATA[tessellation]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=709</guid>
		<description><![CDATA[Le mot clé precise en GLSL (introduit avec l&#8217;extension GL_ARB_gpu_shader5) permet de dire au compilteur GLSL de ne pas faire d&#8217;optimisation sur le calcul d&#8217;une variable. En virgule flottante, a*b*c peut être différent de a*c*b à cause des erreurs d&#8217;arrondi. Dans MSI Kombustor, j&#8217;avais testé ce mot clé avec quelques variables car je cherchais à [...]]]></description>
			<content:encoded><![CDATA[<p><center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201109/asus_geforce_gtx590.jpg" alt="ASUS GeForce GTX 590" /></p>
<p></center></p>
<p><span id="more-709"></span></p>
<p>Le mot clé <b><tt>precise</tt></b> en <b>GLSL</b> (introduit avec l&#8217;extension <a href="http://www.opengl.org/registry/specs/ARB/gpu_shader5.txt">GL_ARB_gpu_shader5</a>) permet de dire au compilteur GLSL de ne pas faire d&#8217;optimisation sur le calcul d&#8217;une variable. En virgule flottante, a*b*c peut être différent de a*c*b à cause des erreurs d&#8217;arrondi.</p>
<p>Dans <a href="http://www.ozone3d.net/msi_kombustor/">MSI Kombustor</a>, j&#8217;avais testé ce mot clé avec quelques variables car je cherchais à résoudre un bug dans la <b>tessellation</b>. Mais le bug n&#8217;était pas lié aux erreurs d&#8217;arrondi et autres optimisations faites par le compilateur. J&#8217;ai trouvé la solution plus tard. Le problème c&#8217;est que j&#8217;ai mal nettoyé mon code GLSL et j&#8217;ai oublié un keyword <tt>precise</tt>&#8230; A ce moment là, j&#8217;avais une <b>Radeon HD 6870</b> dans ma machine de dev et cet oubli était passé inaperçu. Mais plusieurs jours après quand j&#8217;ai branché une <b>GeForce GTX 460</b> dans ma machine, j&#8217;ai eu une mauvaise surprise. Le rendu de mon object avec tessellation et shadow mapping était passé en mode tacheté:<br />
<center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201109/msi_kombustor_220_beta_bug_glsl_precise.jpg" alt="MSI Kombustor, bug due to the precise keyword in GLSL" /></p>
<p></center></p>
<p>
Dans Kombustor, il y a plusieurs tests 3D qui utilisent la tessellation sur les objets 3D avec du shadow mapping pour créer des ombres. Le shadow mapping utilise en gros deux passes: une passe ambiente pour initialiser le z-buffer et dessiner la scene avec l&#8217;eclairage ambient, et une seconde passe, dite passe d&#8217;illumination, pour colorier les pixels en fonction de la shadow map. La seconde passe etant rendue avec un <tt>glDepthFunc(GL_EQUAL)</tt> (et du blending) pour ne colorier que les pixels nécessaires.</p>
<p>Le rendu avec <tt>GL_EQUAL</tt> fonctionne bien si les vertices calculés dans la seconde passe ont exactement la même position finale que ceux calculés dans la première passe. Mais dans le cas de Kombustor, j&#8217;avais oublié une variable avec le mot clé <tt>precise</tt> dans un des shaders de tessellation (le TES, Tessellation Evaluation Shader) de la passe d&#8217;illumination. Sur les Radeons (<b>HD 6800 et HD 6900</b>) cela n&#8217;a posé aucun problème mais sur une GeForce, ça ne pardonne pas. La position des vertices calculés dans la passe d&#8217;illumination est très légèrement différente à cause du mot clé <tt>précise</tt> et du coup, certains pixels de la seconde passe, n&#8217;ayant plus exactement le même Z que ceux de la première passe, ont été eliminés par le test de profondeur ou depth-test. D&#8217;où l&#8217;apparition des tâches qui correspondent aux endroits où les pixels n&#8217;ont pas le bon Z.</p>
<p>J&#8217;ai passé quelques heures sur ce sale bug et après avoir compris que le mot clé <tt>précise</tt> était la source de tous mes ennuis, j&#8217;ai enfin retrouvé le bon rendu:<br />
<center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201109/msi_kombustor_220_beta_bug_glsl_precise_fixed.jpg" alt="MSI Kombustor, bug due to the precise keyword in GLSL" /></p>
<p></center></p>
<p>
Le mot clé <tt>précise</tt> semble avoir plus d&#8217;influence sur les optimisations faites par le compilteur GLSL de NVIDIA que celui d&#8217;AMD. Le mot clé <tt>précise</tt> est-il pris en compte par le compilo GLSL d&#8217;AMD? Y&#8217;a-t-il des optimisations dans les calculs flottants avec les cartes Radeon (j&#8217;imagine que oui)? </p>
<p>Maintenant je comprends pour NVIDIA insiste souvent, dans les presentations OpenGL 4, sur l&#8217;importance du mot clé precise avec les GeForce.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20110923/les-cartes-geforce-et-le-keyword-glsl-precise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les Sampler States OpenGL 3.3: Configurer les Unités de Texture</title>
		<link>http://www.ozone3d.net/blogs/lab/20110908/tutorial-opengl-3-3-sampler-states-configurer-unites-de-texture/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20110908/tutorial-opengl-3-3-sampler-states-configurer-unites-de-texture/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 11:33:35 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[GL_ARB_sampler_objects]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[sampler]]></category>
		<category><![CDATA[texture]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=701</guid>
		<description><![CDATA[Je viens de tester les sampler states disponibles avec OpenGL 3.3 dans Kombustor 2.2.x. Les samplers states servent tout simplement à définir l&#8217;état d&#8217;une unité de texture, indépendamment de l&#8217;objet texture qui y est appliqué. Les sampler states sont décrits dans cette spec OpenGL: GL_ARB_sampler_objects. Chose intéressante, les sampler states OpenGL 3.3 permettent de coller [...]]]></description>
			<content:encoded><![CDATA[<p><center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201109/msi_kombustor_tessy_sphere.jpg" alt="MSI Kombustor, tessellated sphere, DoF and soft shadows" /></p>
<p></center></p>
<p><span id="more-701"></span></p>
<p>Je viens de tester les sampler states disponibles avec <b>OpenGL 3.3</b> dans Kombustor 2.2.x. Les samplers states servent tout simplement à définir l&#8217;état d&#8217;une unité de texture, indépendamment de l&#8217;objet texture qui y est appliqué. Les sampler states sont décrits dans cette spec OpenGL: <a href="http://www.opengl.org/registry/specs/ARB/sampler_objects.txt">GL_ARB_sampler_objects</a>.</p>
<p>Chose intéressante, les sampler states OpenGL 3.3 permettent de coller à la logique de <b>Direct3D 11</b> qui définit aussi cette abstraction hardware avec la structure <b>D3D11_SAMPLER_DESC</b> et les fonctions CreateSamplerState (device D3D11) et PSSetSamplers (contexte immediat). Avant OpenGL 3.3, l&#8217;état d&#8217;une unité de texture était lié à un objet texture (créé avec glGenTextures). Maintenant avec les sampler states, on s&#8217;approche du niveau hardware / GPU. </p>
<p>Voyons rapidement comment utiliser les sampler states. </p>
<p><b>1 &#8211; Création et initialisation du sampler:</b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">GLuint sampler_state <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
glGenSamplers<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>sampler_state<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
glSamplerParameteri<span style="color: #009900;">&#40;</span>sampler_state<span style="color: #339933;">,</span> GL_TEXTURE_WRAP_S<span style="color: #339933;">,</span> GL_REPEAT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
glSamplerParameteri<span style="color: #009900;">&#40;</span>sampler_state<span style="color: #339933;">,</span> GL_TEXTURE_WRAP_T<span style="color: #339933;">,</span> GL_REPEAT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
glSamplerParameteri<span style="color: #009900;">&#40;</span>sampler_state<span style="color: #339933;">,</span> GL_TEXTURE_MAG_FILTER<span style="color: #339933;">,</span> GL_LINEAR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
glSamplerParameteri<span style="color: #009900;">&#40;</span>sampler_state<span style="color: #339933;">,</span> GL_TEXTURE_MIN_FILTER<span style="color: #339933;">,</span> GL_LINEAR_MIPMAP_LINEAR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
glSamplerParameterf<span style="color: #009900;">&#40;</span>sampler_state<span style="color: #339933;">,</span> GL_TEXTURE_MAX_ANISOTROPY_EXT<span style="color: #339933;">,</span> <span style="color:#800080;">16.0f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Je viens de créer un sampler state de filtrage linéaire avec X16 de filtrage anisotropique. Les paramètres sont les mêmes que ceux utilisés lors de la création d&#8217;une texture.</p>
<p><b>2 &#8211; Utilisation du sampler</b></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">GLuint texture_unit <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
glBindSampler<span style="color: #009900;">&#40;</span>texture_unit<span style="color: #339933;">,</span> sampler_state<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
...</pre></td></tr></table></div>

<p>Rien de plus simple: il suffit de dire sur quelle unité de texture doit on appliquer notre sampler. Une fois appliqué sur une unité de texture, les réglages du sampler sont prioritaires à ceux d&#8217;un objet de texture. Donc c&#8217;est super simple d&#8217;ajouter les sampler states dans votre code OpenGL. Pas besoin de modifier le code existant de création des textures.</p>
<p>Quand on ne veut plus utiliser un sampler sur une unité de texture, il suffit d&#8217;appeller le code suivant:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">glBindSampler<span style="color: #009900;">&#40;</span>texture_unit<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><b>3 &#8211; Destruction du sampler:</b></p>
<pre>
glDeleteSamplers(1, &#038;sampler_state);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20110908/tutorial-opengl-3-3-sampler-states-configurer-unites-de-texture/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>OpenGL Versions, Features Overview</title>
		<link>http://www.ozone3d.net/blogs/lab/20110531/opengl-versions-features-overview/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20110531/opengl-versions-features-overview/#comments</comments>
		<pubDate>Tue, 31 May 2011 11:59:24 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[feature]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=502</guid>
		<description><![CDATA[OpenGL 1.1 – Texture objects OpenGL 1.2 – 3D textures, BGRA and packed pixel formats OpenGL 1.3 – Multitexturing, multisampling, texture compression OpenGL 1.4 – Depth textures OpenGL 1.5 – Vertex Buffer Object (VBO), Occlusion Queries OpenGL 2.0 – GLSL 1.1, MRT, Non Power of Two textures, Point Sprites, Two-sided stencil OpenGL 2.1 – GLSL [...]]]></description>
			<content:encoded><![CDATA[<p><center><br />
<img src="http://www.ozone3d.net/public/jegx/201008/opengl.jpg" aolt="OpenGL logo"/><br />
</center><br />
<span id="more-502"></span></p>
<ul>
<li><b>OpenGL 1.1</b> – Texture objects</li>
<li>OpenGL 1.2 – 3D textures, BGRA and packed pixel formats</li>
<li>OpenGL 1.3 – Multitexturing, multisampling, texture compression</li>
<li>OpenGL 1.4 – Depth textures</li>
<li>OpenGL 1.5 – Vertex Buffer Object (VBO), Occlusion Queries</li>
<li><b>OpenGL 2.0</b> – GLSL 1.1, MRT, Non Power of Two textures, Point Sprites, Two-sided stencil</li>
<li>OpenGL 2.1 – GLSL 1.2, Pixel Buffer Object (PBO), sRGB Textures</li>
<li><b>OpenGL 3.0</b> – GLSL 1.3, Texture Arrays, Conditional rendering, Frame Buffer Object (FBO)</li>
<li>OpenGL 3.1 – GLSL 1.4, Instancing, Texture Buffer Object, Uniform Buffer Object, Primitive restart</li>
<li>OpenGL 3.2 – GLSL 1.5, Geometry Shader, Multi-sampled textures</li>
<li>OpenGL 3.3 – GLSL 3.30 Backports as much functionality possible from the OpenGL 4.0 specification</li>
<li><b>OpenGL 4.0</b> – GLSL 4.00 Tessellation on GPU, shaders with 64-bit precision</li>
<li>OpenGL 4.1 &#8211; GLSL 4.10 Developer-friendly debug outputs, compatibility with OpenGL ES 2.0</li>
</ul>
<p><!--more--><br />
<a href="http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units#OpenGL_version_note">[source]</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20110531/opengl-versions-features-overview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GLSL Random Generator</title>
		<link>http://www.ozone3d.net/blogs/lab/20110427/glsl-random-generator/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20110427/glsl-random-generator/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 11:59:18 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[glsl]]></category>
		<category><![CDATA[noise]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[shader]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=421</guid>
		<description><![CDATA[Small noise / random function in GLSL: varying vec3 v; float rand(vec2 n) { return 0.5 + 0.5 * fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453); } void main(void) { float x = rand(v.xz); gl_FragColor = vec4(x, x, x, 1.0); } Noise function tested in GeeXLab (OpenGL 2):]]></description>
			<content:encoded><![CDATA[<p><img alt="GLSL random / noise" src="http://www.ozone3d.net/public/jegx/201104/geexlab_glsl_random_20110427-02.jpg" title="GLSL random / noise" class="aligncenter" width="400" height="286" /></p>
<p><span id="more-421"></span></p>
<p>Small noise / random function in GLSL:</p>
<pre>
varying vec3 v;
<b>float rand(vec2 n)</b>
{
  return 0.5 + 0.5 *
     fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);
}
void main(void)
{
  float x = rand(v.xz);
  gl_FragColor = vec4(x, x, x, 1.0);
}
</pre>
<p>Noise function tested in <a href="http://www.geeks3d.com/geexlab/">GeeXLab</a> (OpenGL 2):<br />
<img src="http://www.ozone3d.net/public/jegx/201104/geexlab_glsl_random_20110427.jpg" alt="GLSL random function" class="aligncenter"  /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20110427/glsl-random-generator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Test de la Double Precision FP64 en GLSL</title>
		<link>http://www.ozone3d.net/blogs/lab/20100927/test-de-la-double-precision-fp64-en-glsl/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20100927/test-de-la-double-precision-fp64-en-glsl/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 15:58:12 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Tests et Reviews]]></category>
		<category><![CDATA[Tools de JeGX]]></category>
		<category><![CDATA[double precision]]></category>
		<category><![CDATA[fp64]]></category>
		<category><![CDATA[fractal]]></category>
		<category><![CDATA[GeeXLab]]></category>
		<category><![CDATA[glsl]]></category>
		<category><![CDATA[julia]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=381</guid>
		<description><![CDATA[Je viens juste de finir une petite demo GeeXLab pour tester le support de la double precision (fp64) dans les shaders OpenGL. La fractale de Mandelbrot / Julia est un excellent exemple de l&#8217;intérêt de la double precision dans les shaders. Sur la gauche le rendu de la fractale de Julia en simple précision (fp32), [...]]]></description>
			<content:encoded><![CDATA[<p><center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201009/geexlab_fractal_julia_gpu_fp64_glsl.jpg" alt="GLSL, FP64, fractal, GeeXLab"/></p>
</p>
<p></center><br />
<span id="more-381"></span><br />
Je viens juste de finir une petite demo <a href="http://www.geeks3d.com/geexlab/">GeeXLab</a> pour tester le support de la <b>double precision</b> (<b>fp64</b>) dans les shaders <b>OpenGL</b>. La <b>fractale de Mandelbrot / Julia</b> est un excellent exemple de l&#8217;intérêt de la double precision dans les shaders. Sur la gauche le rendu de la fractale de Julia en simple précision (fp32), sur la droite le rendu en double précision fp64. Un seul shader <b>GLSL</b> qui mixe fp32 et fp64 est utilisé pour le rendu de la fractale.<br />
<br />
Cette demo fonctionnne bien sur une GTX 460 + <a href="http://www.geeks3d.com/20100914/nvidia-r260-63-beta-with-gts-450-support-and-improved-performances/">R260.63</a>. Pas encore testé sur Radeon, il y a deux GTX 480 branchés sur ma machine de test. Je ferai ça un peu plus tard.<br />
<br />
Il est temps de publier une mise à jour de GeeXLab avec toutes les nouvelles fonctionnalités. Rendez-vous sur <a href="http://www.geeks3d.com/">Geeks3D.com</a> dans peu de temps pour le téléchargement&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20100927/test-de-la-double-precision-fp64-en-glsl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>(GLSL) Ecriture dans gl_FragDepth</title>
		<link>http://www.ozone3d.net/blogs/lab/20100926/glsl-ecriture-dans-gl_fragdepth/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20100926/glsl-ecriture-dans-gl_fragdepth/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 13:54:26 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[depth buffer]]></category>
		<category><![CDATA[glsl]]></category>
		<category><![CDATA[gl_FragCoord]]></category>
		<category><![CDATA[gl_FragDepth]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=368</guid>
		<description><![CDATA[gl_FragDepth est une des built-in variables disponibles dans GLSL. Plus exactement, gl_FragDepth est une variable de sortie du fragment shader. gl_FragDepth sert à mettre à jour la valeur du depth buffer pour le fragment en cours de traitement. C&#8217;est un variable de type float. gl_FragDepth n&#8217;est pas obligatoire et si elle n&#8217;est pas présente dans [...]]]></description>
			<content:encoded><![CDATA[<p><center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201009/glsl.jpg" alt="GLSL, OpenGL shading language"/></p>
<p></center><br />
<span id="more-368"></span><br />
<b>gl_FragDepth</b> est une des built-in variables disponibles dans <b>GLSL</b>. Plus exactement, gl_FragDepth est une variable de sortie du fragment shader. gl_FragDepth sert à mettre à jour la valeur du <b>depth buffer</b> pour le fragment en cours de traitement. C&#8217;est un variable de type float.<br />
<br />
gl_FragDepth n&#8217;est pas obligatoire et si elle n&#8217;est pas présente dans le pixel shader (ooops le fragment shader je voulais dire), OpenGL la met à jour automatiquement avec la bonne valeur. Quand elle est présente dans le frag shader, le developpeur doit bien sur la mettre à jour, mais doit aussi faire attention aux différents branchmements (if/else) afin qu&#8217;une valeur soit écrite quelque soit la branche. En résumé, gl_FragDepth doit être obligatoirement mise à jour dans tous les cas, sinon sa valeur sera indéfinie (car OpenGL ne va pas s&#8217;en occuper).<br />
<br />
Quelle valeur écrire dans gl_FragDepth? Et bien je vois deux cas: soit une valeur qui dépend de votre algo, soit une simple copie de <b>gl_FragCoord.z</b>. Un petit example de frag shader:</p>
<pre>
uniform float x;
void main (void)
{
  if (x &lt; 0.5)
    gl_FragDepth = x;
  else
    gl_FragDepth = gl_FragCoord.z;
}
</pre>
<p>En général gl_FragDepth varie de 0.0 à 1.0:<br />
- 0.0 représente un pixel sur le near plane de la camera<br />
- 1.0 représente un pixel sur le far plane de la camera</p>
<p>gl_FragDepth est disponible dans toutes les version de GLSL, y compris dans le GLSL d&#8217;<b>OpenGL 4 et 4.1</b>.</p>
<p>Voilà, c&#8217;est tout ce que j&#8217;ai à dire sur gl_FragDepth pour aujourd&#8217;hui! Si j&#8217;ai dit une bétise ou mieux si vous avez quelque chose à ajouter par rapport à gl_FragDepth, un petit commentaire (ou un tweet) fera l&#8217;affaire.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20100926/glsl-ecriture-dans-gl_fragdepth/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Visualisez les Molécules en OpenGL + AO avec QuteMol</title>
		<link>http://www.ozone3d.net/blogs/lab/20100805/visualisez-les-molecules-en-opengl-ao-avec-qutemol/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20100805/visualisez-les-molecules-en-opengl-ao-avec-qutemol/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 20:03:26 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[ambient occlusion]]></category>
		<category><![CDATA[molecule]]></category>
		<category><![CDATA[qutmol]]></category>
		<category><![CDATA[visualisation]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=342</guid>
		<description><![CDATA[QutMol est un soft pour visualiser les molécules (format PDB) et utilise OpenGL pour le rendu 3D. Bon QutMol (drôle de nom au passage) n&#8217;a pas été updaté depuis presque 3 ans mais dans la liste des features il y a: Real Time Ambient Occlusion. C&#8217;est bon je lance le download&#8230; Une grosse molécule avec [...]]]></description>
			<content:encoded><![CDATA[<p><center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201008/qutmol_01.jpg" alt="QutMol - high quality molecular visualization system"/></p>
<p></center><br />
<span id="more-342"></span></p>
<p><a href="http://qutemol.sourceforge.net/">QutMol</a> est un soft pour visualiser les molécules (format PDB) et utilise <b>OpenGL</b> pour le rendu 3D. Bon QutMol (drôle de nom au passage)  n&#8217;a pas été updaté depuis presque 3 ans mais dans la liste des features il y a: <i>Real Time Ambient Occlusion</i>. C&#8217;est bon je lance le download&#8230;</p>
<p>Une grosse molécule avec de l&#8217;AO uniquement:<br />
<center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201008/qutmol_02.jpg" alt="QutMol - real time ambient occlusion"/></p>
<p></center></p>
<p>Et là une autre molécule avec toujours de l&#8217;AO mais aussi une détection de silhouette et même un petit halo (noir) pour la rendre plus classe la publication des molécules sur les sites web par exemple:<br />
<center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201008/qutmol_03.jpg" alt="QutMol - real time ambient occlusion - silhouette detection"/></p>
<p></center></p>
<p>Tiens, je vais peut être en faire une news sur Geeks3D un des ces quatres <img src='http://www.ozone3d.net/blogs/lab/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20100805/visualisez-les-molecules-en-opengl-ao-avec-qutemol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Demos (Videos!) Particules OpenGL JOGL</title>
		<link>http://www.ozone3d.net/blogs/lab/20100805/demos-videos-particules-opengl-jogl/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20100805/demos-videos-particules-opengl-jogl/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 19:35:57 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[jogl]]></category>
		<category><![CDATA[particle system]]></category>
		<category><![CDATA[stateless]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=339</guid>
		<description><![CDATA[Basic stateless &#8220;Particle System&#8221; calculated entirely as vertex shader. JOGL est le wrapper OpenGL pour le language Java. Voilà quelques videos sympas qui montrent des particles JOGL en action. &#8220;Intermediate Particle System&#8221; using a more complex movement algorithm as in the &#8220;Basic Particle System&#8221;]]></description>
			<content:encoded><![CDATA[<p><center><br />
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="344" src="http://www.youtube.com/embed/CTf6e3T93o4" frameborder="0" allowFullScreen="true"> </iframe><br />
<br /><i>Basic stateless &#8220;Particle System&#8221; calculated entirely as vertex shader.</i><br />
</center><br />
<span id="more-339"></span><br />
<a href="http://jogamp.org/jogl/www/">JOGL</a> est le wrapper <b>OpenGL</b> pour le language Java. Voilà quelques videos sympas qui montrent des particles JOGL en action.</p>
<p><center><br />
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="425" height="344" src="http://www.youtube.com/embed/E_pPPjT-Ero" frameborder="0" allowFullScreen="true"> </iframe><br />
<br /><i>&#8220;Intermediate Particle System&#8221; using a more complex movement algorithm as in the &#8220;Basic Particle System&#8221;</i><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20100805/demos-videos-particules-opengl-jogl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geometry Instancing en OpenGL: le Presque Retour!</title>
		<link>http://www.ozone3d.net/blogs/lab/20100625/geometry-instancing-opengl-gtx480-hd5870/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20100625/geometry-instancing-opengl-gtx480-hd5870/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 12:20:55 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[geometry instancing]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=318</guid>
		<description><![CDATA[80,000,000 de polygones&#8230; c&#8217;est cool l&#8217;instancing! Vue les feedbacks réguliers (genre: le download n&#8217;est plus dispo!!!) que je reçois par rapport au petit article que j&#8217;ai pondu il y a 2 ans sur le geometry instancing en OpenGL, j&#8217;ai decidé de remettre le pack de demos à jour. Et j&#8217;ai ajouté un nouveau mode basé [...]]]></description>
			<content:encoded><![CDATA[<p><center></p>
<p><img src="http://www.ozone3d.net/public/jegx/201006/opengl_geometry_instancing_20100625.jpg" alt="OpenGL geometry instancing"/><br /><i>80,000,000 de polygones&#8230; c&#8217;est cool l&#8217;instancing!</i></p>
<p></center><br />
<span id="more-318"></span></p>
<p>Vue les feedbacks réguliers (genre: le download n&#8217;est plus dispo!!!) que je reçois par rapport au <a href="http://www.ozone3d.net/blogs/lab/20080316/opengl-geometry-instancing/">petit article</a> que j&#8217;ai pondu il y a 2 ans sur le <b>geometry instancing en OpenGL</b>, j&#8217;ai decidé de remettre le pack de demos à jour. </p>
<p>Et j&#8217;ai ajouté un nouveau mode basé sur les <b>uniform buffers</b>.</p>
<p>Les demos fonctionnent maintenant correctement sur ma <b>GTX 480</b>. Et bien sûr, je viens juste de tester sur une <b>HD 5870</b> + Cat 10.6 et ça mer&#8230; euh crashe!</p>
<p>Et vue que j&#8217;ai pas envie de remplacer la GTX 480 par la HD 5870 sur ma machine de dev, je vais devoir debugger à distance&#8230;</p>
<p>Dès que c&#8217;est ok sur la radeon, je publie l&#8217;article complet sur <a href="http://www.geeks3d.com">Geeks3D.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20100625/geometry-instancing-opengl-gtx480-hd5870/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PyOpenGL pour Coder en OpenGL dans GeeXLab Sans Compilation</title>
		<link>http://www.ozone3d.net/blogs/lab/20090806/pyopengl-pour-coder-en-opengl-dans-geexlab-sans-compilation/</link>
		<comments>http://www.ozone3d.net/blogs/lab/20090806/pyopengl-pour-coder-en-opengl-dans-geexlab-sans-compilation/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 19:19:40 +0000</pubDate>
		<dc:creator>JeGX</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Tools de JeGX]]></category>
		<category><![CDATA[GeeXLab]]></category>
		<category><![CDATA[pyopengl]]></category>

		<guid isPermaLink="false">http://www.ozone3d.net/blogs/lab/?p=259</guid>
		<description><![CDATA[Là j&#8217;avoue je m&#8217;amuse Ce que j&#8217;adore avec Python, c&#8217;est la richesse des librairies tierces. Il y a pratiquement une librairie pour chaque besoin. Le mien était de pouvoir faire des render calls (ou draw call) dans les scripts Python de GeeXLab. GeeXLab possède des scripts de type Direct Rendering: il est possible dans ce [...]]]></description>
			<content:encoded><![CDATA[<p><center></p>
<p><img src="http://www.ozone3d.net/blogs/lab/public/200908/pyopengl-logo.gif" alt="PyOpenGL"/></p>
<p></center><br />
<span id="more-259"></span><br />
Là j&#8217;avoue je m&#8217;amuse <img src='http://www.ozone3d.net/blogs/lab/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Ce que j&#8217;adore avec <b>Python</b>, c&#8217;est la richesse des librairies tierces. Il y a pratiquement une librairie pour chaque besoin. Le mien était de pouvoir faire des render calls (ou draw call) dans les scripts Python de <b>GeeXLab</b>. GeeXLab possède des scripts de type Direct Rendering: il est possible dans ce type de script de faire des rendus d&#8217;objets et plus généralement de contrôler le renderer temps réel (oui la fameuse carte graphique). Du coup j&#8217;ai coder une librairie LUA/Python au doux nom de HYP_Renderer. Cette lib a les fonctions de base pour dialoguer avec la carte graphique via OpenGL. Mais pour être le plus complet possible, il faudrait implémenter une bonne partie des fonctions OpenGL, ce qui représente un certain travail.</p>
<p>Je me suis dit, tiens, c&#8217;est peut être le moment de tester PyOpenGL&#8230; <a href="http://pyopengl.sourceforge.net/">PyOpenGL</a> est tout simplement la version Python de l&#8217;API OpenGL. La syntaxe et le nom des fonctions, tout y est!</p>
<p>Alors hop, un petit download (en fait plusieurs car la toute dernière version de la lib, PyOpenGL-3.0.1a2.win32.exe, semble avoir quelques bugs, je me suis donc rabattu sur le fichier PyOpenGL-3.0.0c1.win32.exe), une petite install, et me voici prêt à tester <b>PyOpenGL</b>. Je me code vite fait (bah oui c&#8217;est GeeXLab&#8230;) une petite demo qui exploite les scripts direct rendering:</p>
<p><center></p>
<p><img src="http://www.ozone3d.net/blogs/lab/public/200908/geexlab-direct-rendering-pyopengl.jpg" alt="PyOpenGL"/></p>
<p></center><br />
Sur l&#8217;image, le fond dégradé et la grille sont rendus par la logique du moteur 3D, ce qui veut dire aucun render call explicite.</p>
<p>Le carré rouge, les deux sphères et les deux lignes au contraire sont dessinés par des render calls comme le montre le script ci dessous:</p>
<pre>
import HYP_Utils
import HYP_Camera
import HYP_Renderer
import HYP_Object
import HYP_Lighting
import HYP_Scene

#--- Lib PyOpenGL
<b>from OpenGL.GL import *</b>

#--- Les matrices de vue et de projection sont
#--- collés à la carte graphique.
HYP_Camera.ApplyToRenderer(gMainCameraId)

sceneWidth, sceneHeight = HYP_Scene.GetWindowSize()

#--- Yeah! Des petits appels OpenGL. Trop bon!
#--- Ces cinq lignes dessine le carré rouge...
<b>glEnable(GL_SCISSOR_TEST)
glScissor(sceneWidth/2-100, sceneHeight/2-100, 200, 200);
glClearColor(1.0, 0.0, 0.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
glDisable(GL_SCISSOR_TEST)</b>

#--- Les lignes suivantes dessinent les deux spheres et les
#--- deux lignes
HYP_Lighting.ApplyToRenderer(gLight01Id)

HYP_Object.ApplyRasterizerStatesToRenderer(gMeshSphere)
HYP_Material.ApplyToRenderer(gSphereMat)

HYP_Renderer.GPUShaderBind(gPhongShader_GLId)
HYP_Object.SetPosition(gMeshSphere, -20.0, 0.0, 0.0);
HYP_Mesh.RenderSubset(gMeshSphere, 0);
HYP_Renderer.GPUShaderBind(0)

HYP_Renderer.GPUShaderBind(gNormalShader_GLId)
HYP_Object.SetPosition(gMeshSphere, 20.0, 0.0, 0.0);
HYP_Mesh.RenderSubset(gMeshSphere, 0);
HYP_Renderer.GPUShaderBind(0)

HYP_Camera.ApplyToRenderer(gMainCameraId)

HYP_Renderer.SetLightingState(0)
HYP_Renderer.SetLineThickness(2.0)
HYP_Renderer.DrawLine(-20.0, -20.0, 20.0,
	1.0, 0.0, 0.0, 1.0,
	20.0, 20.0, -20.0,
	0.0, 1.0, 0.0, 1.0)
HYP_Renderer.DrawLine(20.0, -20.0, 20.0,
	0.0, 0.0, 1.0, 1.0,
	-20.0, 20.0, -20.0,
	1.0, 1.0, 0.0, 1.0)
HYP_Renderer.SetLineThickness(1.0)
</pre>
<p>Pouvoir coder avec l&#8217;API OpenGL sans compilation est assez délirant! Grâce à PyOpenGL, GeeXLab devient une plateforme pour apprendre à programmer en OpenGL simplement.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ozone3d.net/blogs/lab/20090806/pyopengl-pour-coder-en-opengl-dans-geexlab-sans-compilation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 8/56 queries in 0.347 seconds using disk: basic
Object Caching 620/760 objects using disk: basic

Served from: www.ozone3d.net @ 2012-02-09 04:25:34 -->
