# JOGL Cubemap



## Pfaeff (28. Aug 2009)

Hallo,

Ich möchte meinem GLSL Shader eine Cubemap übergeben (samplerCube).
Wie muss ich diese dazu laden und wie übergebe ich sie dem Shader?

Gefunden habe ich das: Cube Map OpenGL Tutorial
Damit sollte ich in der Lage sein, die Daten zu laden. Wie übergebe ich die aber meinem Shader?

Vielen Dank,

mfg


----------



## Pfaeff (30. Aug 2009)

Ich bin bisher soweit gekommen: 
	
	
	
	





```
package tools.gl;

import javax.media.opengl.*;
import com.sun.opengl.util.texture.*;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.io.*;

public class Cubemap {
	private GL gl;
	private int tid;

	public Cubemap(GL gl) {
		this.gl = gl;
	}

	public void bind() {
		gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, tid);
		gl.glTexGeni(GL.GL_S, GL.GL_TEXTURE_GEN_MODE, GL.GL_NORMAL_MAP);
		gl.glTexGeni(GL.GL_T, GL.GL_TEXTURE_GEN_MODE, GL.GL_NORMAL_MAP);
		gl.glTexGeni(GL.GL_R, GL.GL_TEXTURE_GEN_MODE, GL.GL_NORMAL_MAP);
		gl.glEnable(GL.GL_TEXTURE_GEN_S);
		gl.glEnable(GL.GL_TEXTURE_GEN_T);
		gl.glEnable(GL.GL_TEXTURE_GEN_R);
		gl.glEnable(GL.GL_TEXTURE_CUBE_MAP);
	}

	public boolean loadFromFile(String[] filenames) {
		if (filenames.length < 6)
			return false;
		try {
			IntBuffer idBuffer = IntBuffer.allocate(1);
			gl.glGenTextures(1, idBuffer);
			tid = idBuffer.get();
			gl.glBindTexture(GL.GL_TEXTURE_CUBE_MAP, tid);

			for (int i = 0; i < 6; i++) {
				File tmpFile = new File(filenames[i]);
				if (!tmpFile.exists())
					return false;
				TextureData td = TextureIO.newTextureData(tmpFile, false, null);
				ByteBuffer buffer = (ByteBuffer) td.getBuffer();
				gl.glTexImage2D(GL.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
						GL.GL_RGB8, td.getWidth(), td.getHeight(), 0,
						GL.GL_RGB, GL.GL_UNSIGNED_BYTE, buffer);

			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return false;
		}
		return true;
	}
}
```
 Anwenden tue ich das Ganze wie folgt:

```
gl.glActiveTexture(GL.GL_TEXTURE0);
		cubemap.bind();		
		shader.bindShader();
		// Cubemap
		int env = shader.getLocation("env");
		gl.glUniform1i(env, 0);
```
Meine Shader sehen so aus:
*Vertex-Shader:*

```
varying vec3 normal;
void main() {
	normal = normalize(gl_NormalMatrix * gl_Normal);
	gl_TexCoord[0] = gl_MultiTexCoord0;
	gl_Position = ftransform();
}
```
*Fragment-Shader:*

```
uniform samplerCube env;
varying vec3 normal;
void main(void) {
	vec3 TexCoord = vec3(gl_TexCoord[0]);
	gl_FragColor = textureCube(env, normal + TexCoord);
}
```
Allerdings ist mein Objekt komplett schwarz. Ich denke, dass ich etwas beim Laden der Cubemap falsch gemacht habe. Die Datei scheint gefunden zu werden und OpenGL gibt auch keinen Fehler.

mfg


----------



## Pfaeff (31. Aug 2009)

Bis zum Buffer scheint alles zu stimmen, der Fehler liegt also entweder beim "glTexImage2D" (was ich bezweifle), beim Anwenden der Textur oder im Shader. Nur komme ich gerade was das angeht nicht weiter.

Oder sagt mir das hier, dass mein Buffer erzeugt wurde, aber leer ist? Die Größe stimmt auf jedenfall (256*256*3).

```
java.nio.HeapByteBuffer[pos=0 lim=196608 cap=196608]
```
Ich denke das "pos=0" ist normal an der Stelle.


----------



## Marco13 (31. Aug 2009)

Ja, ich denke, das muss so sein - zumindest meine ich mich sogar zu erinnern, dass man manchmal explizit buffer.rewind() aufrufen musste, bevor man ihn binden oder verwenden wollte. Hab' das ganze aber mangels Zeit (und mangels KSKB und mangels CubeMap) noch nicht getestet.


----------



## Pfaeff (31. Aug 2009)

Ich hab mal ein Testprojekt angehängt. Als "Cubemap" habe ich einfach ein paar Paintbilder dazugepackt.
Momentan wird dort eine gluSphere gezeichnet.

Sollten dort die Normalen falsch herum sein, so muss stattdessen 
	
	
	
	





```
// Draw Object
		GLUquadric sphere = glu.gluNewQuadric();
		glu.gluQuadricOrientation(sphere, GLU.GLU_OUTSIDE);
		glu.gluSphere(sphere, 1, 32, 32);
```
verwendet werden.


----------



## Marco13 (31. Aug 2009)

Ich werd' im Lauf der Woche mal drüberschauen, kann aber natürlich nichts versprechen. (Ich sollte keinen Urlaub mehr machen ... das sammeln sich SO viele Todos... )


----------



## Marco13 (2. Sep 2009)

Etwa 14.75 Sekunden, bevor ich geschrieben hätte: "Mach' deinen Sch*** doch selbst! " (sowas kann echt frustrierend sein...  ) habe ich in der CubeMap#loadFromFile hinter dem glBindTexture die Zeile
[c]gl.glTexParameteri(GL.GL_TEXTURE_CUBE_MAP, GL.GL_GENERATE_MIPMAP, GL.GL_TRUE);[/c]
eingefügt, und jetzt malt er hübsch die Cube Map auf die Kugel. Warum auch immer :bahnhof: 
Falls es nicht funktioniert (weil ich noch etwas anderes geändert hatte, was ich jetzt übersehen habe), sag' nochmal bescheid.


----------



## Pfaeff (3. Sep 2009)

Wow es funktioniert  Das scheint das fehlende Glied gewesen zu sein. Vielen, vielen, vielen Dank 
Komisch nur, dass ich Codes gefunden habe (die angeblich gehen sollen), wo diese Zeile nicht vorhanden war.
Nunja, dann kann ich mich ja endlich an meine Refraction-Shader machen 

mfg


----------

