<?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>quixotic project blog &#187; lwjgl</title>
	<atom:link href="http://michi.ist.inspirationslos.de/lang/en/tag/lwjgl/feed/" rel="self" type="application/rss+xml" />
	<link>http://michi.ist.inspirationslos.de</link>
	<description></description>
	<lastBuildDate>Sat, 06 Feb 2010 10:11:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Trouble with Vertex Buffer Objects solved</title>
		<link>http://michi.ist.inspirationslos.de/lang/en/2009/10/25/trouble-with-vertex-buffer-objects-solved</link>
		<comments>http://michi.ist.inspirationslos.de/lang/en/2009/10/25/trouble-with-vertex-buffer-objects-solved#comments</comments>
		<pubDate>Sun, 25 Oct 2009 17:29:59 +0000</pubDate>
		<dc:creator>michi</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[lwjgl]]></category>
		<category><![CDATA[sleepless nights debugging]]></category>

		<guid isPermaLink="false">http://michi.ist.inspirationslos.de/?p=162</guid>
		<description><![CDATA[It has been a while since I last used Vertex Buffer Objects (VBO) with LWJGL. It seemed as if they had changed some of the method signatures since I used them last time. I couldn&#8217;t even get the simplest example running. After experimenting for a while I finally figured it out. Have a look at [...]]]></description>
			<content:encoded><![CDATA[<p>It has been a while since I last used Vertex Buffer Objects (VBO) with <a href="http://www.lwjgl.org" target="_self">LWJGL</a>. It seemed as if they had changed some of the method signatures since I used them last time. I couldn&#8217;t even get the simplest example running. After experimenting for a while I finally figured it out. Have a look at the signature of the VertexPointer method:</p>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> glVertexPointer<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> size, <span style="color: #000066; font-weight: bold;">int</span> type,
  <span style="color: #000066; font-weight: bold;">int</span> stride, <span style="color: #000066; font-weight: bold;">long</span> pointer_buffer_offset<span style="color: #009900;">&#41;</span>;</pre></div></div>

<p>With the last offset one can specify where the vertex information starts in the buffer given to the VBO management. Well, I could/should have guessed that this offset has to be in <strong>bytes</strong> since I am dealing with a buffer here but instead I used the number of <strong>floats</strong>.. So next time I see an operation dealing with buffers that takes a long argument I&#8217;ll try the byte-count from the beginning..</p>
]]></content:encoded>
			<wfw:commentRss>http://michi.ist.inspirationslos.de/lang/en/2009/10/25/trouble-with-vertex-buffer-objects-solved/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GLSL Shader in Java mit LWJGL</title>
		<link>http://michi.ist.inspirationslos.de/lang/en/2008/12/29/glsl-shader-in-java-mit-lwjgl</link>
		<comments>http://michi.ist.inspirationslos.de/lang/en/2008/12/29/glsl-shader-in-java-mit-lwjgl#comments</comments>
		<pubDate>Mon, 29 Dec 2008 14:46:26 +0000</pubDate>
		<dc:creator>michi</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[glsl]]></category>
		<category><![CDATA[lwjgl]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[shader]]></category>

		<guid isPermaLink="false">http://michi.ist.inspirationslos.de/?p=81</guid>
		<description><![CDATA[Shaderprogrammierung in GLSL, der Shadersprache unter OpenGL, war bisher ein Buch mit sieben Siegeln für mich. Aber da man ja alles lernen kann habe ich mich auf die Suche nach Tutorials gemacht und auch einige sehr gute entdeckt. Die Einführung von Lighthouse3d ist zum Beispiel sehr zu empfehlen. Hier wird wirklich mit den Grundlagen angefangen [...]]]></description>
			<content:encoded><![CDATA[<p>Shaderprogrammierung in GLSL, der Shadersprache unter OpenGL, war bisher ein Buch mit sieben Siegeln für mich. Aber da man ja alles lernen kann habe ich mich auf die Suche nach Tutorials gemacht und auch einige sehr gute entdeckt. Die Einführung von <a href="http://www.lighthouse3d.com/opengl/glsl/index.php?intro">Lighthouse3d</a> ist zum Beispiel sehr zu empfehlen. Hier wird wirklich mit den Grundlagen angefangen und erstmal eine Beschreibung geliefert wie die Pipeline der Grafikkarten aufgebaut sind und wo genau die verschiedenen Shader zum Einsatz kommen. </p>
<p>Natürlich muss man die geschriebenen (oder abgetippten) Shader auch irgendwie ausprobieren. Hier fand ich das Programm <a href="http://www.typhoonlabs.com/">ShaderDesigner</a> von Typhoon Labs ganz brauchbar. Leider scheint es die Firma nicht mehr zu geben, aber sowohl ShaderDesigner als auch ein ebenfalls super geschriebenes Tutorial für Shader lassen sich nach wie vor von der Seite runterladen. </p>
<p>Schließlich habe ich mich daran gemacht, die Shader auch in einem wirklichen Programm einzusetzen. Hierfür verwende ich die &#8220;Light Weight Java Games Library&#8221; (<a href="http://www.lwjgl.org">LWJGL</a>), meinem Lieblingsbinding von OpenGL an Java. Es stellte sich heraus, dass wenn man mal einen funktionierenden Shader hat, diesen wirklich einfach in ein Programm einbinden kann. Wirklich geholfen hat mir der entsprechende <a href="http://lwjgl.org/wiki/doku.php/lwjgl/tutorials/opengl/basicshaders">Wikieintrag</a> im LWJGL Wiki. Am besten speichert man Vertex- und Fragmentshader in einer Textdatei und legt sie irgendwo im Projektverzeichnis ab. Im Programm werden die Dateien dann mit ganz gewöhnlichen Hausmitteln erstmal geöffnet und in einem Bytearray gespeichert. Dies muss natürlich sowohl für Vertex- als auch für Fragmentshader passieren:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #003399;">ClassLoader</span> loader <span style="color: #339933;">=</span> ShaderTest.<span style="color: #000000; font-weight: bold;">class</span>.<span style="color: #006633;">getClassLoader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #003399;">InputStream</span> is <span style="color: #339933;">=</span> loader.<span style="color: #006633;">getResourceAsStream</span><span style="color: #009900;">&#40;</span>shadername<span style="color: #009900;">&#41;</span>;
<span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> shadercode <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span>;
<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">DataInputStream</span> dis <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">DataInputStream</span><span style="color: #009900;">&#40;</span>is<span style="color: #009900;">&#41;</span>;
    dis.<span style="color: #006633;">readFully</span><span style="color: #009900;">&#40;</span>shadercode <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span>is.<span style="color: #006633;">available</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>;
    dis.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
    is.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Anschließend werden die Bytearrays in einen ByteBuffer kopiert, den LWJGL lieber mag:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;">ByteBuffer shader <span style="color: #339933;">=</span> BufferUtils.<span style="color: #006633;">createByteBuffer</span><span style="color: #009900;">&#40;</span>shadercode.<span style="color: #006633;">length</span><span style="color: #009900;">&#41;</span>;
shader.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>shadercode<span style="color: #009900;">&#41;</span>;
shader.<span style="color: #006633;">flip</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;</pre></td></tr></table></div>

<p>Nicht vergessen die Buffer zu flippen!<br />
Anschließend teilen wir OpenGL mit, dass wir zwei neue Shaderobjekte brauchen. Dies funktioniert genau wie wenn man eine Textur anlegt: Man teilt OpenGL mit, was man haben will und bekommt ein int zurück, mit dem man das neue Objekt referenzieren kann:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> vertexShaderID <span style="color: #339933;">=</span> ARBShaderObjects.<span style="color: #006633;">glCreateShaderObjectARB</span><span style="color: #009900;">&#40;</span>
ARBVertexShader.<span style="color: #006633;">GL_VERTEX_SHADER_ARB</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000066; font-weight: bold;">int</span> pixelShaderID <span style="color: #339933;">=</span> ARBShaderObjects.<span style="color: #006633;">glCreateShaderObjectARB</span><span style="color: #009900;">&#40;</span>
ARBFragmentShader.<span style="color: #006633;">GL_FRAGMENT_SHADER_ARB</span><span style="color: #009900;">&#41;</span>;</pre></td></tr></table></div>

<p>Nachdem die entsprechenden Objekte nun OpenGL bekannt gemacht wurden müssen wir OpenGL nun mitteilen was die Shader genau machen sollen, sprich deren Quellcode übergeben. Danach werden die Shader kompiliert:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;">ARBShaderObjects.<span style="color: #006633;">glShaderSourceARB</span><span style="color: #009900;">&#40;</span>vertexShaderID, vertexShader<span style="color: #009900;">&#41;</span>;
ARBShaderObjects.<span style="color: #006633;">glCompileShaderARB</span><span style="color: #009900;">&#40;</span>vertexShaderID<span style="color: #009900;">&#41;</span>;
&nbsp;
ARBShaderObjects.<span style="color: #006633;">glShaderSourceARB</span><span style="color: #009900;">&#40;</span>pixelShaderID, pixelShader<span style="color: #009900;">&#41;</span>;
ARBShaderObjects.<span style="color: #006633;">glCompileShaderARB</span><span style="color: #009900;">&#40;</span>pixelShaderID<span style="color: #009900;">&#41;</span>;</pre></td></tr></table></div>

<p>vertexShader und pixelShader sind die Variablen, die auf die ByteBuffer zeigen und den eingelesenen Quelltext enthalten.<br />
Die beiden Shader werden nun zu einem Programm zusammengebunden. Ein Programm wird dabei ebenso wie ein Shaderobjekt erstellt: bei einem Methodenaufruf erhalten wir ein int mit dem wir das Programm in Zukunft referenzieren. Hat man nur einen Vertex- oder nur einen Fragmentshader zur Hand wird der jeweils andere Teil von OpenGL durch eine Standartimplementierung ersetzt. Zum Schluß werden die Teile ähnlich einem C Programm zusammengebunden.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> shaderProgramID <span style="color: #339933;">=</span> ARBShaderObjects.<span style="color: #006633;">glCreateProgramObjectARB</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
ARBShaderObjects.<span style="color: #006633;">glAttachObjectARB</span><span style="color: #009900;">&#40;</span>shaderProgramID, vertexShaderID<span style="color: #009900;">&#41;</span>;
ARBShaderObjects.<span style="color: #006633;">glAttachObjectARB</span><span style="color: #009900;">&#40;</span>shaderProgramID, pixelShaderID<span style="color: #009900;">&#41;</span>;
ARBShaderObjects.<span style="color: #006633;">glLinkProgramARB</span><span style="color: #009900;">&#40;</span>shaderProgramID<span style="color: #009900;">&#41;</span>;</pre></td></tr></table></div>

<p>Jetzt sind wir fertig und können den Shader beim Rendern benutzen. Hierzu ruft man im Renderloop bevor das Objekt das den Shader erhalten soll gezeichnet wird die folgende Methode auf</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;">ARBShaderObjects.<span style="color: #006633;">glUseProgramObjectARB</span><span style="color: #009900;">&#40;</span>shaderProgramID<span style="color: #009900;">&#41;</span>;</pre></td></tr></table></div>

<p>Wird anstatt einem Shaderprogramm &#8220;0&#8243; übergeben benutzt OpenGL die Standarteinstellungen (fixed Pipeline) zum Rendern.</p>
<p>Ein kleiner Test mit einem Toon-Shader aus dem Lighthouse Tutorial sieht dann zum Beispiel so aus:<br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/tehoMVoUHb4&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/tehoMVoUHb4&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>Die Veränderung der Farbe des 3d Modells hängt nicht mit dem Licht zusammen sondern wird im Fragmentshader verursacht. Hierzu wird eine Variable vom Javaprogramm aus an den Shader übergeben, die die Zeit seit dem Beginn der Anwendung übergibt. Im Fragmentshader ist die Variable so definiert:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;">uniform <span style="color: #000066; font-weight: bold;">float</span> TIME_SINCE_INIT;</pre></td></tr></table></div>

<p>Bei jedem Durchlauf des Renderloops wird diese Variable vom Javaprogramm neu geschrieben. Um den Schreibvorgang durchzuführen wird vorher die Location der Variable bestimmt. Dazu wird OpenGL der mit 0 terminierte Name der Variablen übergeben. Existiert diese, dann liefert OpenGL eine Location in Form eines Integers zurück und man kann mit einem glUniform1fARB-Aufruf den Wert übergeben.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;">ByteBuffer buff <span style="color: #339933;">=</span> BufferUtils.<span style="color: #006633;">createByteBuffer</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">&quot;TIME_SINCE_INIT&quot;</span>.<span style="color: #006633;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>;
buff.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;TIME_SINCE_INIT&quot;</span>.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>;
buff.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0<span style="color: #009900;">&#41;</span>;
buff.<span style="color: #006633;">flip</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #000066; font-weight: bold;">int</span> location <span style="color: #339933;">=</span> ARBShaderObjects.<span style="color: #006633;">glGetUniformLocationARB</span><span style="color: #009900;">&#40;</span>
    shaderProgramID, buff<span style="color: #009900;">&#41;</span>;
ARBShaderObjects.<span style="color: #006633;">glUniform1fARB</span><span style="color: #009900;">&#40;</span>location, gameLogicTimer.<span style="color: #006633;">getTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://michi.ist.inspirationslos.de/lang/en/2008/12/29/glsl-shader-in-java-mit-lwjgl/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
