OpenGL LWJGL 纹理渲染失败
OpenGL LWJGL Texture Rendering Failure
使用 LWJGL 的 OpenGL 1.1 版和 2D 纹理时,我发现自己卡住了...
出于某种原因,LWJGL 引擎不会在 2D 图层上渲染加载的纹理...相反,我得到一个白色方块..
我假设我的代码中很可能遗漏了一些东西。下面是与此类事件相关的完整代码。
正在加载 OpenGL 环境:
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glEnable(GL_TEXTURE_2D);
glClearColor(0, 0, 0, 1);
glClearDepth(1);
glClearStencil(0);
glColor3f(1.0f, 1.0f, 1.0f);
进入 2D 绘图模式(用于绘制纯色方块的功能 - 通过 glcolor 函数测试,然后调用 glvertex 尺寸):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
加载图像(已通过 Swing 测试环境验证其功能):
this.ref = ref;
if (!fmt.isImage()) {
return;
}
f = new File("file/path/to/image.gif");
if (!f.exists() || !f.canRead()) {
return;
}
BufferedImage tmp = ImageIO.read(f);
WritableRaster raster = WritableRaster.createInterleavedRaster(DataBuffer.TYPE_BYTE, tmp.getWidth(), tmp.getHeight(), 4, null);
img = new BufferedImage(glColorModel, raster, false, new Hashtable());
Graphics g = img.getGraphics();
g.setColor(new Color(0, 0, 0, 0));
g.fillRect(0, 0, img.getWidth(), img.getHeight());
g.drawImage(tmp, 0, 0, null);
g.dispose();
正在转换图像数据:
byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
buff = ByteBuffer.allocateDirect(data.length);
buff.put(data);
buff.flip();
将数据移动到 OpenGL 缓冲区中:
id = glGenTextures();
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_BYTE, buff);
在二维表面绘制纹理:
glBindTexture(GL_TEXTURE_2D, tex.getId());
glTranslatef(x, y, 0);
glBegin(GL_QUADS);
{
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(w, 0);
glVertex2f(w, 0);
glTexCoord2f(w, h);
glVertex2f(w, h);
glTexCoord2f(0, h);
glVertex2f(0, h);
}
glEnd();
我对 LWJGL 甚至 OpenGL 都不是很熟悉,但是,作为一个 Java 开发人员并且研究了一些示例源代码,这段代码对我来说看起来很合适。 .
最终,我的问题是 "How can I fix this?" 我在输入时添加了 "glEnable(GL_TEXTURE_2D);",这导致绘图区域从白色变为血红色...
在 OpenGL 中,纹理坐标从 [0,0](表示左下角)到 [1,1](右上角)。当纹理坐标超出此范围且 GL_TEXTURE_WRAP_[R|S|T] 设置为 GL_REPEAT(默认情况下)时,纹理中的实际查找位置由
计算
lookup.xy = fract(texCoord.xy)
在此处给出的特殊情况下,纹理坐标范围为0-w,这将导致纹理重复w次。由于视口宽度也设置为 w,因此每次重复的宽度仅为 1px。
使用 LWJGL 的 OpenGL 1.1 版和 2D 纹理时,我发现自己卡住了...
出于某种原因,LWJGL 引擎不会在 2D 图层上渲染加载的纹理...相反,我得到一个白色方块..
我假设我的代码中很可能遗漏了一些东西。下面是与此类事件相关的完整代码。
正在加载 OpenGL 环境:
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glEnable(GL_TEXTURE_2D);
glClearColor(0, 0, 0, 1);
glClearDepth(1);
glClearStencil(0);
glColor3f(1.0f, 1.0f, 1.0f);
进入 2D 绘图模式(用于绘制纯色方块的功能 - 通过 glcolor 函数测试,然后调用 glvertex 尺寸):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
加载图像(已通过 Swing 测试环境验证其功能):
this.ref = ref;
if (!fmt.isImage()) {
return;
}
f = new File("file/path/to/image.gif");
if (!f.exists() || !f.canRead()) {
return;
}
BufferedImage tmp = ImageIO.read(f);
WritableRaster raster = WritableRaster.createInterleavedRaster(DataBuffer.TYPE_BYTE, tmp.getWidth(), tmp.getHeight(), 4, null);
img = new BufferedImage(glColorModel, raster, false, new Hashtable());
Graphics g = img.getGraphics();
g.setColor(new Color(0, 0, 0, 0));
g.fillRect(0, 0, img.getWidth(), img.getHeight());
g.drawImage(tmp, 0, 0, null);
g.dispose();
正在转换图像数据:
byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
buff = ByteBuffer.allocateDirect(data.length);
buff.put(data);
buff.flip();
将数据移动到 OpenGL 缓冲区中:
id = glGenTextures();
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_BYTE, buff);
在二维表面绘制纹理:
glBindTexture(GL_TEXTURE_2D, tex.getId());
glTranslatef(x, y, 0);
glBegin(GL_QUADS);
{
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(w, 0);
glVertex2f(w, 0);
glTexCoord2f(w, h);
glVertex2f(w, h);
glTexCoord2f(0, h);
glVertex2f(0, h);
}
glEnd();
我对 LWJGL 甚至 OpenGL 都不是很熟悉,但是,作为一个 Java 开发人员并且研究了一些示例源代码,这段代码对我来说看起来很合适。 .
最终,我的问题是 "How can I fix this?" 我在输入时添加了 "glEnable(GL_TEXTURE_2D);",这导致绘图区域从白色变为血红色...
在 OpenGL 中,纹理坐标从 [0,0](表示左下角)到 [1,1](右上角)。当纹理坐标超出此范围且 GL_TEXTURE_WRAP_[R|S|T] 设置为 GL_REPEAT(默认情况下)时,纹理中的实际查找位置由
计算lookup.xy = fract(texCoord.xy)
在此处给出的特殊情况下,纹理坐标范围为0-w,这将导致纹理重复w次。由于视口宽度也设置为 w,因此每次重复的宽度仅为 1px。