<?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>C++, Qt et GPU &#187; Geometry shaders</title>
	<atom:link href="https://blog.developpez.com/gpu/?cat=14&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/gpu</link>
	<description></description>
	<lastBuildDate>Fri, 24 May 2013 17:02:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Introduction aux geometry shaders</title>
		<link>https://blog.developpez.com/gpu/?p=1</link>
		<comments>https://blog.developpez.com/gpu/?p=1#comments</comments>
		<pubDate>Thu, 12 Apr 2012 08:14:02 +0000</pubDate>
		<dc:creator><![CDATA[gbdivers]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Facile]]></category>
		<category><![CDATA[Geometry shaders]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A la demande de LittleWhite, mon premier bloc technique est consacré à l&#8217;utilisation des geometry shader. Il n&#8217;y a rien de tres compliqué donc je présente un exemple simple apres quelques rappels. Pour ceux qui ne connaissent pas du tout &#8230; <a href="https://blog.developpez.com/gpu/?p=1">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>A la demande de LittleWhite, mon premier bloc technique est consacré à l&rsquo;utilisation des geometry shader. Il n&rsquo;y a rien de tres compliqué donc je présente un exemple simple apres quelques rappels. Pour ceux qui ne connaissent pas du tout les geometry shaders, je ferais un article plus detaille sur ce sujet.<br />
Pour faire au plus simple, j&rsquo;utilise Qt et en particulier QShaderProgram, qui gère les geometry shaders depuis Qt 4.7.<br />
<span id="more-1"></span></p>
<p><em><strong>Quelques rappels</strong></em><br />
Les geometry shaders sont optionnels et s&rsquo;intercalent entre les vertex shaders et les fragment shaders. Ils travaillent sur des primitives (triangle, ligne, points, avec un maximum de 6 vertices) et permettent de générer d&rsquo;autres primitives. Ils sont disponibles dans le Core depuis OpenGL 3.2 / GLSL 1.5 ou avant avec l&rsquo;extension GL_ARB_geometry_shader4 (en ajoutant le code #extension GL_EXT_geometry_shader4 : enable dans le geometry shader).</p>
<div class="codecolorer-container cpp blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #666666;">// Rechercher la présence de GL_EXT_geometry_shader4 pour &nbsp; </span><br />
&nbsp; &nbsp; <span style="color: #666666;">// tester si les geometry shaderssont pris en charge </span><br />
&nbsp; &nbsp; glGetString<span style="color: #008000;">&#40;</span>GL_EXTENSIONS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> &nbsp;<br />
&nbsp; &nbsp; glGetStringi<span style="color: #008000;">&#40;</span>GL_EXTENSIONS, i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// GL 3.2 </span><br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #666666;">// Créer un geometry shader </span><br />
&nbsp; &nbsp; glCreateShader<span style="color: #008000;">&#40;</span>GL_GEOMETRY_SHADER<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <br />
&nbsp; &nbsp; QGLShader shader<span style="color: #008000;">&#40;</span>QGLShader<span style="color: #008080;">::</span><span style="color: #007788;">Geometry</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Qt 4.7 </span><br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #666666;">// Gérer les informations de position </span><br />
&nbsp; &nbsp; gl_PositionIn<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// position du vertex i en entrée </span><br />
&nbsp; &nbsp; gl_Position<span style="color: #008080;">;</span> <span style="color: #666666;">// position du nouveau vertex émis </span><br />
&nbsp; &nbsp; gl_in<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">gl_Position</span><span style="color: #008080;">;</span> <span style="color: #666666;">// GLSL &gt; 330 </span><br />
&nbsp; &nbsp; gl_in.<span style="color: #007788;">length</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// GLSL &gt; 330, nombre de vertices en entrée </span><br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #666666;">// Générer des vertices et primitives (GLSL) </span><br />
&nbsp; &nbsp; EmitVertex<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <br />
&nbsp; &nbsp; EndPrimitive<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #666666;">// Spécifier le type de primitives en entrée et sortie </span><br />
&nbsp; &nbsp; <span style="color: #666666;">// (GLSL) </span><br />
&nbsp; &nbsp; layout <span style="color: #008000;">&#40;</span>triangles<span style="color: #008000;">&#41;</span> in<span style="color: #008080;">;</span> <span style="color: #666666;">// points, lines, triangles, lines_adjacency ou triangles_adjacency </span><br />
&nbsp; &nbsp; layout <span style="color: #008000;">&#40;</span>triangle_strip<span style="color: #008000;">&#41;</span> out<span style="color: #008080;">;</span> <span style="color: #666666;">// points, line_strip ou triangle_strip </span><br />
&nbsp; &nbsp; layout <span style="color: #008000;">&#40;</span>max_vertices <span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span> out<span style="color: #008080;">;</span> <span style="color: #666666;">// maximum = GL_MAX_GEOMETRY_OUTPUT_VERTICES </span><br />
&nbsp;<br />
&nbsp; &nbsp; <span style="color: #666666;">// (Qt) </span><br />
&nbsp; &nbsp; program_shader.<span style="color: #007788;">setGeometryInputType</span><span style="color: #008000;">&#40;</span>GL_TRIANGLES<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <br />
&nbsp; &nbsp; program_shader.<span style="color: #007788;">setGeometryOutputType</span><span style="color: #008000;">&#40;</span>GL_LINE_STRIP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <br />
&nbsp; &nbsp; program_shader.<span style="color: #007788;">setGeometryOutputVertexCount</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></div></td></tr></tbody></table></div>
<p>Lors de l&rsquo;appel à glDrawArray ou glDrawElement, il faut que le type spécifié corresponde au type d&rsquo;entrée du geometry shader. Les correspondances autorisées sont :</p>
<ol>
<li>points : GL_POINTS</li>
<li>lines : GL_LINES, GL_LINE_LOOP ou GL_LINE_STRIP</li>
<li>triangles : GL_TRIANGLES, GL_TRIANGLE_FAN ou GL_TRIANGLE_STRIP</li>
<li>lines_adjacency : GL_LINES_ADJACENCY</li>
<li>triangles_adjacency : GL_TRIANGLES_ADJACENCY</li>
</ol>
<p>Les nouveaux types ADJACENCY (GL_LINES_ADJACENCY, GL_LINE_STRIP_ADJACENCY, GL_TRIANGLES_ADJACENCY et GL_TRIANGLE_STRIP_ADJACENCY) permettent d&rsquo;accéder aux vertices des primitives voisines de la primitive en cours de traitement.</p>
<p><img src="http://gbelz.developpez.com/blog/geometry-shader.png" alt="Exemple d'affichage des vecteurs normaux" title="Exemple d'affichage des vecteurs normaux" /></p>
<p><strong><em>Un exemple simple</em></strong><br />
L&rsquo;exemple choisit est tres tres classique. Il permet d&rsquo;afficher le mailage d&rsquo;un mesh, les vecteurs normaux des faces et de calculer les vecteurs normaux de chaque face (flat mode). Cet exemple me permet également d&rsquo;introduire quelques classes simples, pour lire un fichier .obj (version simplifiee), calculer les vecteurs normaux, initialiser un contexte GL avec Qt.</p>
<p>Pour l&rsquo;affichage des vecteurs normaux et des triangles, on a besoin des positions et des normales, que l&rsquo;on passent donc aux shaders en attributs. </p>
<p>Pour afficher les vecteurs normaux dans le geometry shader, on prend un seul vertex en entree (input = points) et l&rsquo;on retourne une ligne (output = lignes, size = 2), dont le premier point est la position du vertex et le second point est la position du vertex auquel on ajoute le vecteur normal (multiplie par une constante, passee comme uniform, pour modifier la longueur du vecteur)</p>
<p>Pour afficher les triangles, on recupere un triangle en entree (input = triangles) et l&rsquo;on retourne 3 lignes (output = lignes, size = 6). Chaque points correspond a la position d&rsquo;un vertex decale legerement par le vecteur normal (pour que les lignes soient bien visibles et ne soient pas cachees par les triangles).</p>
<p><a href="http://gbelz.developpez.com/blog/geometry-shader.zip">Télécharger le projet d&rsquo;exemple</a></p>
<p><strong><em>A suivre&#8230;</em></strong></p>
<ol>
<li><a href="http://www.google.fr/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=4&amp;cts=1331312136494&amp;ved=0CEwQFjAD&amp;url=http%3A%2F%2Fweb.engr.oregonstate.edu%2F~mjb%2Fcs519%2FHandouts%2Fgeometry_shaders.1pp.pdf&amp;ei=ATZaT6zoFIiz8QPy3IXPDg&amp;usg=AFQjCNG9d-4Lpr0TbpuvK0iQrvmRVXKaMw&amp;sig2=zf5Oc9N-aIUMtgqDR-FXqw">Shrink, explosion, subdivision, silhouette, hedgehog</a></li>
<li><a href="http://www.twodee.org/blog/?p=805">Explosion, cheveux</a></li>
<li><a href="http://bat710.univ-lyon1.fr/~jpfarrug/Geometry.pdf">Instanciation et culling</a></li>
<li><a href="http://bat710.univ-lyon1.fr/~jciehl/Public/educ/M2PROIMA/2011/opengl_cm4.pdf">Instanciation et culling</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
