我正在尝试渲染一组纹理四边形。
我可以使彩色四边形渲染,但不会纹理化(屏幕显示为空。)
我正在使用LWJGL和PNGDecoder。
初始化我的OGL的代码:
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 800, 0, 600, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glEnable(GL11.GL_TEXTURE_2D);
解码我的图片的代码:
ByteBuffer buffer = null;
InputStream in = ClassLoader.getSystemResourceAsStream(filename);
try {
buffer = decodeStreamToBuffer(in);
} finally {
in.close();
}
return buffer;
我的decodeStreamToBuffer(InputStream in)
:
PNGDecoder decoder;
ByteBuffer buf = null;
try {
decoder = new PNGDecoder(in);
buf = ByteBuffer.allocateDirect(4*decoder.getWidth()*decoder.getHeight());
decoder.decode(buf, decoder.getWidth()*4, Format.RGBA);
buf.flip();
} catch (Exception e) {
e.printStackTrace();
}
return buf;
我的渲染代码:
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glColor3f(0.5f, 0.5f, 1.0f); //Still there to test color quads.
// draw quad
GL11.glPushMatrix();
GL11.glTranslatef(screencenter.getX(), screencenter.getY(), 0);
GL11.glScalef(1f, 0.5f, 1f);
GL11.glRotatef(camRotation, 0f, 0f, 1f);
GL11.glTranslatef(-screencenter.getX(), -screencenter.getY(), 0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
GL11.glBegin(GL11.GL_TEXTURE_2D);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex2f(32, 0);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex2f(32, 32);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex2f(0, 32);
GL11.glEnd();
GL11.glPopMatrix();
当我离开纹理绑定并将GL_TEXTURE_2D
更改为GL_MODELVIEW
时,一切正常......但是使用颜色而不是纹理。我在这里犯了一个菜鸟错误吗?
答案 0 :(得分:2)
这是错误的GL11.glBegin(GL11.GL_TEXTURE_2D);
glBegin
方法primitive mode
GLenum
。
因此你要么使用:
GL_POINTS
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUADS
GL_QUAD_STRIP
GL_POLYGON
您使用的模式指定要渲染的内容。在您的情况下,您需要编码GL_QUADS
因此,要修改代码,您需要将GL11.glBegin(GL11.GL_TEXTURE_2D);
替换为GL11.glBegin(GL11.GL_QUADS);
。
另请注意,glVertex
,glNormal
,glTexCoord
等方法已弃用,不应使用。您可以使用VBO和着色器。 虽然如果您正在学习OpenGL,那么继续使用已弃用的方法,因为它们在学习时很好用且易于使用!