OpenGL纹理在3.3中都是黑色的 - 但在3.1中工作

时间:2013-04-18 11:30:33

标签: c++ opengl glsl

我目前正在OpenGL3.3中开发一个简单的3D场景,但是在尝试纹理对象时 - 所有这些场景都是黑色纹理。但是,如果我将上下文版本更改为3.1;在模型上正确渲染纹理没有问题。

我不确定这是否表示我使用了弃用的功能/方法,但我很难看出问题出在哪里。

设置纹理

(load texture from file)
...
glGenTextures(1, &TexID);               // Create The Texture ( CHANGE )
glBindTexture(GL_TEXTURE_2D, TexID);

glTexImage2D(GL_TEXTURE_2D, 0, texture_bpp / 8, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
...

将纹理绑定到渲染

// mLocation is the layout location in the shader, from glGetUniformLocation
// mTextureUnit is the specified texture unit to load into. Currently using 0.
// mTextureID is the ID of the loaded texture, as generated above.
glActiveTexture( GL_TEXTURE0 + mData.mTextureUnit );
glBindTexture( GL_TEXTURE_2D, mData.mTextureID );
glUniform1i( mLocation, mData.mTextureUnit );

片段着色器

uniform sampler2D diffusemap;
in vec2 passUV;
out vec3 outColour;
...
outColour = texture( diffusemap, passUV ).rgb;

正在使用的所有纹理都是2的方形大小。


显示问题的图片。

GL3.1:http://i.imgur.com/NUgj6vA.png

GL3.3:http://i.imgur.com/oOc0jcd.png


顶点着色器

#version 330 core

uniform mat4 p;
uniform mat4 v;
uniform mat4 m;

in vec3 vertex;
in vec3 normal;
in vec2 uv;

out vec3 passVertex;
out vec3 passNormal;
out vec2 passUV;

void main( void )
{
    gl_Position = p * v * m * vec4( vertex, 1.0 );

    passVertex = vec3( m * vec4( vertex, 1.0 ) );
    passNormal = vec3( m * vec4( normal, 1.0 ) );
    passUV = uv;
}

2 个答案:

答案 0 :(得分:5)

在行中:

glTexImage2D(GL_TEXTURE_2D, 0, texture_bpp / 8, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData);

(texture_bpp / 8)将返回正确格式类型的假设不正确。它应该是指定内部格式的GLenum值之一,例如GL_RGBA。

将其更正(或与纹理文件的内部格式匹配的格式)完全解决了问题,并且适用于GL3.3和GL3.1:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData);

答案 1 :(得分:3)

为了完整起见,internal format of a texture应该是一个普查员。还有一个大小的枚举器,而不是其中一个未经过大小调整的枚举器。如果您可以使用GL_RGB,请停止使用GL_RGB8

  

答案正确地识别了问题,但如果解释为什么先前的假设适用于3.1而不是3.3,将会有所帮助。

使用范围[1,4]上的数字的能力在OpenGL 3.0中已弃用,并在OpenGL 3.1中被删除。 然而,当时没有办法说“给我OpenGL版本3.1的实际核心配置文件”; WGL/GLX_CONTEXT_CORE_PROFILE_BIT_ARB s不存在。因此,当您获得3.1上下文时,导出ARB_compatibility extension的实现完全合法,这仍然允许所有已删除的功能。

在3.2中,explicitly select a profile的能力被添加到OpenGL中。此时,您不会让某人在核心配置文件中显示ARB_compatibility。这就是为什么你的代码工作时你要求3.1(因为它可以自由地给你3.1兼容性),但不是当你要求3.3核心配置文件时。