我几个小时以来一直在抨击我的头,现在我确定它很简单,但我无法得到结果。我不得不稍微编辑这段代码,因为我已经构建了一个小库来封装OpenGL调用,但以下内容是对事件状态的精确描述。OpenGL,Shader Model 3.3纹理:黑色纹理?
我用下面的顶点着色器:
#version 330
in vec4 position;
in vec2 uv;
out vec2 varying_uv;
void main(void)
{
gl_Position = position;
varying_uv = uv;
}
而下面的片段着色器:
#version 330
in vec2 varying_uv;
uniform sampler2D base_texture;
out vec4 fragment_colour;
void main(void)
{
fragment_colour = texture2D(base_texture, varying_uv);
}
两个着色器编译没有问题的程序的链接。
在我的初始化部分,我打开一个单独的纹理像这样:
// Check for errors.
kt::kits::open_gl::Core<QString>::throw_on_error();
// Load an image.
QImage image("G:/test_image.png");
image = image.convertToFormat(QImage::Format_RGB888);
if(!image.isNull())
{
// Load up a single texture.
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits());
glBindTexture(GL_TEXTURE_2D, 0);
}
// Check for errors.
kt::kits::open_gl::Core<QString>::throw_on_error();
你会看到,我使用Qt来加载纹理。对:: throw_on_error()的调用会检查OpenGL中的错误(通过调用Error()),并在出现异常时引发异常。此代码中不会出现OpenGL错误,并且使用Qt加载的图像是有效的。如下进行
绘图:
// Clear previous.
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT);
// Use our program.
glUseProgram(GLProgram);
// Bind the vertex array.
glBindVertexArray(GLVertexArray);
/* ------------------ Setting active texture here ------------------- */
// Tell the shader which textures are which.
kt::kits::open_gl::gl_int tAddr = glGetUniformLocation(GLProgram, "base_texture");
glUniform1i(tAddr, 0);
// Activate the texture Texture(0) as texture 0.
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, Texture);
/* ------------------------------------------------------------------ */
// Draw vertex array as triangles.
glDrawArrays(GL_TRIANGLES, 0, 4);
glBindVertexArray(0);
glUseProgram(0);
// Detect errors.
kt::kits::open_gl::Core<QString>::throw_on_error();
同样,不发生错误的OpenGL和三角形被吸引到screeen。然而,它看起来像这样:
我突然想到这个问题可能与我的纹理坐标。所以,我使用呈现S作为“红色”部分下面的图片,和T作为“绿色”成分:
纹理坐标显示正确,但我仍然收到的黑三角厄运。我究竟做错了什么?
我不认为这是相关的。如果他们没有设置,那么将使用默认值 – 2012-01-11 11:38:09
你先生,是男人之神! @VJovic我以为完全一样的东西:)。 – 2012-01-11 12:16:53
哇这也解决了我的问题。看起来'GL_TEXTURE_MIN_FILTER'没有具体的默认值。 – Henk 2012-08-05 16:33:21