【发布时间】:2017-08-17 16:10:40
【问题描述】:
我正在使用 LWJGL 在屏幕上绘制“图块”或带纹理的 2D 方块。但是,纹理坐标始终为 (0, 0),因此纹理正方形仅使用第一个像素颜色来填充它。
这是我的顶点着色器:
#version 330 core
in vec4 in_Position;
in vec4 in_Color;
in vec2 in_TextureCoord;
out vec4 pass_Color;
out vec2 pass_TextureCoord;
void main(void) {
gl_Position = in_Position;
pass_Color = in_Color;
pass_TextureCoord = in_TextureCoord;
}
这是我的片段着色器:
#version 330 core
uniform sampler2D texture_diffuse;
in vec4 pass_Color;
in vec2 pass_TextureCoord;
out vec4 out_Color;
void main(void) {
out_Color = pass_Color;
// Override out_Color with our texture pixel
out_Color = texture(texture_diffuse, pass_TextureCoord);
}
这实际上是我用来绘制正方形的代码:
ARBShaderObjects.glUseProgramObjectARB(shaderProgram);
glBindTexture(GL_TEXTURE_2D, sprite.getId());
glBegin(GL11.GL_QUADS);
glVertex2d(screenMinX, screenMinY);
glTexCoord2d(0.0, 0.0);
glVertex2d(screenMaxX, screenMinY);
glTexCoord2d(1.0, 0.0);
glVertex2d(screenMaxX, screenMaxY);
glTexCoord2d(1.0, 1.0);
glVertex2d(screenMinX, screenMaxY);
glTexCoord2d(0.0, 1.0);
glEnd();
// release the shader
ARBShaderObjects.glUseProgramObjectARB(0);
我无法修复它,因为我不知道上面的代码是如何工作的。我没有告诉着色器in_Position、in_Color 或in_TextureCoord 是什么,但前两个似乎工作得很好。它是in_TextureCoord,最终传递给片段着色器,它似乎有一个恒定值 (0, 0) - 我已经确定通过将片段着色器的输出颜色设置为具有等于的通道之一纹理坐标的 X 坐标。它在整个正方形中保持纯色,表明纹理坐标没有变化。
用上面的代码生成的正方形应该是有纹理的,而是涂成纯色 - 给定纹理的第一个像素。如何更改代码以使纹理坐标相应更改?如果我似乎对这一切如何组合在一起有一些误解,请纠正我。
This 是我用来完成上述任务的教程。
附言我知道 Java sn-p 正在使用deprecated immediate-mode,但我不知道如何使用 glDrawArrays 或任何其他常用的方法来完成相同的操作。你能帮我改一下吗?
【问题讨论】:
-
"这基本上就是我用来绘制正方形的代码:" 好吧,你从来没有设置任何纹理坐标,那么你为什么期望它们不是 0、0 呢?
-
@tkausl 如何为每个单独的像素设置纹理坐标?这让我很困惑,因为 OpenGL 似乎在内部处理像素。