Hi,
ich habe mich ein wenig mit VBOs beschäftigt und z.B. das Färben von Flächen funktioniert bei mir bereits sowohl direkt über VBOs als auch über Shader. Aber wie mache ich das nun bei Texturen?
Selbst wenn ich die Texturen über Shader machen will, muss ich ja dennoch die Texturkoordinaten im VBO abspeichern.
Dazu habe ich mal ein KSKB zusammengestellt. (basierend auf dem Code von Oskar)
Das Ergebnis: Schwarzes Bild.
Woran könnte es liegen? (falsche Koordinaten? Fehler in den Shadern?)
textureshader.frag
textureshader.vert
Den Code für Camera und ShaderLoader gibts hier.
ich habe mich ein wenig mit VBOs beschäftigt und z.B. das Färben von Flächen funktioniert bei mir bereits sowohl direkt über VBOs als auch über Shader. Aber wie mache ich das nun bei Texturen?
Selbst wenn ich die Texturen über Shader machen will, muss ich ja dennoch die Texturkoordinaten im VBO abspeichern.
Dazu habe ich mal ein KSKB zusammengestellt. (basierend auf dem Code von Oskar)
Das Ergebnis: Schwarzes Bild.
Woran könnte es liegen? (falsche Koordinaten? Fehler in den Shadern?)
Java:
package glsl3;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import java.io.IOException;
import java.nio.FloatBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.ARBShaderObjects;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
import utility.Camera;
import utility.ShaderLoader;
public class ShaderDemo3 {
private static int shaderProgram, shaderUniform;
public static final String VERTEX_SHADER_LOCATION = "src/glsl2/textureshader.vert";
public static final String FRAGMENT_SHADER_LOCATION = "src/glsl2/textureshader.frag";
private static int vboVertexHandle;
private static int vboTextureHandle;
static Texture texture;
final static int allVertices = 6;
final static int vertexSize = 3;
final static int texSize = 2;
public static void main(String[] args) {
try {
Display.setDisplayMode(new DisplayMode(640, 480));
Display.setVSyncEnabled(true);
Display.setTitle("Shader Demo");
Display.create();
} catch (LWJGLException e) {
System.err.println("The display wasn't initialized correctly. :(");
Display.destroy();
System.exit(1);
}
Camera cam = new Camera((float) Display.getWidth()
/ (float) Display.getHeight(), -2.19f, 1.36f, 11.45f);
cam.setFov(60);
cam.applyProjectionMatrix();
try {
texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("src/glsl2/cobblestone.png"));
} catch (IOException e) {
e.printStackTrace();
}
setUpShaders();
setUpVBO();
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
cam.applyModelviewMatrix(true);
glUseProgram(shaderProgram);
glActiveTexture(GL_TEXTURE0); // change active texture unit to number 0
glBindTexture(GL_TEXTURE_2D, texture.getTextureID()); // bind the colorMap texture to the active texture unit (which is now 0)
ARBShaderObjects.glUniform1iARB(shaderUniform , 0); // Notice the 0 to indicate you want to sample from the texture bound to Texture Unit GL_TEXTURE0.
//render
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glVertexPointer(vertexSize, GL_FLOAT, 0, 0L);
glClientActiveTexture(GL_TEXTURE0);
glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
glTexCoordPointer(texSize, GL_FLOAT, 0, 0L);
glUseProgram(0);
cam.processMouse(1, 80, -80);
cam.processKeyboard(16, 0.003f, 0.003f, 0.003f);
if (Mouse.isButtonDown(0))
Mouse.setGrabbed(true);
else if (Mouse.isButtonDown(1))
Mouse.setGrabbed(false);
Display.update();
Display.sync(60);
}
glDeleteProgram(shaderProgram);
Display.destroy();
System.exit(0);
}
private static void setUpShaders() {
shaderProgram = ShaderLoader.loadShaderPair(VERTEX_SHADER_LOCATION, FRAGMENT_SHADER_LOCATION);
shaderUniform = glGetUniformLocation(shaderProgram, "colorMap");
}
private static void setUpVBO() {
FloatBuffer vertexData = BufferUtils.createFloatBuffer(allVertices
* vertexSize);
FloatBuffer textureData = BufferUtils.createFloatBuffer(allVertices
* 2);
vertexData.put(new float[] { 0,0,0 });
textureData.put(new float[] { 0,0 });
vertexData.put(new float[] { 1,0,0 });
textureData.put(new float[] { 1,0 });
vertexData.put(new float[] { 1,1,0 });
textureData.put(new float[] { 1,1 });
vertexData.put(new float[] { 0,0,0 });
textureData.put(new float[] { 0,0 });
vertexData.put(new float[] { 1,1,0 });
textureData.put(new float[] { 1,1 });
vertexData.put(new float[] { 0,1,0 });
textureData.put(new float[] { 0,1 });
vertexData.flip();
textureData.flip();
vboVertexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vboTextureHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle);
glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
}
textureshader.frag
Code:
uniform sampler2D colorMap;
void main (void)
{
gl_FragColor = texture2D( colorMap, gl_TexCoord[0].st);
}
textureshader.vert
Code:
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
}
Den Code für Camera und ShaderLoader gibts hier.