2012-01-11 160 views
4

我几个小时以来一直在抨击我的头,现在我确定它很简单,但我无法得到结果。我不得不稍微编辑这段代码,因为我已经构建了一个小库来封装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。然而,它看起来像这样:

Texturing, not as expected.

我突然想到这个问题可能与我的纹理坐标。所以,我使用呈现S作为“红色”部分下面的图片,和T作为“绿色”成分:

Coloring using st coordinates.

纹理坐标显示正确,但我仍然收到的黑三角厄运。我究竟做错了什么?

回答

9

我认为这可能取决于你的纹理对象的不完整初始化。

尝试初始化纹理MIN和MAG过滤

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

此外,我建议要检查纹理的大小。如果不是2的幂,那么你必须围绕设置包装模式,以CLAMP_TO_EDGE

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 

黑色纹理往往是由于这个问题,很常见的问题。

+0

我不认为这是相关的。如果他们没有设置,那么将使用默认值 – 2012-01-11 11:38:09

+0

你先生,是男人之神! @VJovic我以为完全一样的东西:)。 – 2012-01-11 12:16:53

+0

哇这也解决了我的问题。看起来'GL_TEXTURE_MIN_FILTER'没有具体的默认值。 – Henk 2012-08-05 16:33:21

2

在你的片段着色器你写一个自定义的目标

fragment_colour = texture2D(base_texture, varying_uv); 

如果这不是要gl_FragColorgl_FragData[…],你有没有正确设置指定的片段数据的位置?

+0

好吧,gl_FragColor不推荐使用,gl_FragData也不推荐使用。 Post 1.2(我认为)你需要使用并绑定到缓冲区。鉴于我可以把所有其他事情都弄好,我不认为是这个问题。 – 2012-01-11 12:10:46

+0

@LiamM:的确,但我想知道你是否无意中错过了这一点。 – datenwolf 2012-01-11 15:03:29