我认为这是因为我的片段着色器没有做正确的采样,就好像它从纹理函数返回的数据全是零,因此四边形的纹理变成了黑色。我怀疑的原因是当我运行程序时,我可以让一个清晰的白色背景,并稍微移动四边形上的一个顶点,以查看背景(因为它通常填满整个表面)。然后我可以清楚地看到那里的白色背景,而四边形在其上方是黑色的。因此,某些输出颜色是由片段着色器产生的,只是错误的颜色,因为我提供的小像素数组只有白色。问题是我不知道为什么它会从我拥有的代码中产生错误的结果。我试图跟随一本书中的内容,该书使用或多或少相同的代码。我还尝试在不同的教程上查找它,但它们似乎都使用相同的方法,所以我被卡住了。
[编辑]
我找出了部分问题。通过使用glGetError()进行一些错误跟踪,我发现我的代码这行出了问题:
glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGB8, 4, 4);
由于第二个参数level为0,返回错误代码1282(无效操作)。如果我将其设置为1,则错误消失。问题随之转移到以下代码行:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_R, GL_FLOAT, myTexture);
虽然更改等级参数,但返回相同的错误。
这是我使用的片段和顶点着色器:
片段着色器
// FRAGMENT SHADER
#version 330
uniform sampler2D tex;
in vec2 vs_tex_coord;
layout (location = 0) out vec4 outputColor;
void main(void)
{
outputColor = texture(tex, vs_tex_coord);
}
顶点着色器
// VERTEX SHADER
#version 330
layout(location = 0) in vec4 position;
layout(location = 1) in vec2 in_tex_coord;
uniform vec2 offset;
out vec2 vs_tex_coord;
void main(void)
{
vec4 finalOffset = vec4(offset.x, offset.y, 0.0, 0.0);
gl_Position = position + finalOffset;
vs_tex_coord = in_tex_coord;
}
我用于生成和存储纹理对象的代码非常简单:
我使用的代码如下:
glGenTextures(1, &textureHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureHandle);
glTexStorage2D(GL_TEXTURE_2D, 0, GL_RGB8, 4, 4);
const GLubyte myTexture[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGB, GL_UNSIGNED_BYTE, myTexture);
myTexture只是以RGB内部格式包含4x4贴图,每个组件都有4位。我已将它们全部设置为白色。
然后,我简单地生成了一个默认采样器:
glGenSamplers(1, &mySampler);
glBindSampler(0, mySampler);
最后我进行渲染:
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(theProgram);
GLuint samplerLoc = glGetUniformLocation(theProgram, "tex");
if (samplerLoc == -1)
printf("Location name could not be found...\n");
glUniform1i(samplerLoc, 0);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(16 * sizeof(float)));
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
我上传到VBO的数组是:
const float vertexPositions[] =
{
// Vertex position
-0.8f, -1.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 0.0f, 1.0f,
// Texture coordinates
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f
};
这是因为我使用采样器对象不正确吗?在正确工作之前,我需要设置某些设置吗?我错过了一些中间步骤吗?
对于任何感兴趣的人,视觉结果如下:
您可以看到白色背景已清除,并且我故意将其中一个顶点位置移动了一点,以便您可以看到黑色四边形与白色背景形成对比。
glTexStorage2D
*会得到额外的加分。 - Nicol Bolas