2010-10-13 129 views
0

我遇到了尝试将纹理加载到VRAM中的问题。我在Mac OS X上使用OpenGL。我通过将颜色传递给片段着色器来成功渲染几何体。但是,只要我尝试加载纹理,就不会呈现几何图形,而只能看到背景颜色。这里是我的纹理加载代码:加重OpenGL纹理问题

char imageData[27] = { 
    127, 127, 127, 
    127, 127, 127, 
    127, 127, 127, 
    127, 127, 127, 
    127, 127, 127, 
    127, 127, 127, 
    127, 127, 127, 
    127, 127, 127, 
    127, 127, 127, 
}; 

glActiveTexture(GL_TEXTURE0); 
GLuint textureID; 
glGenTextures(1, &textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 3, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData); 

GLint uniform_location = glGetUniformLocation(bundle->GetShaderProgramID(), "texture"); 
std::cout << uniform_location <<std::endl; 
glUniform1i(uniform_location, 0); 

glEnable(GL_TEXTURE_2D); 

这是我的片段着色器代码:

uniform sampler2D texture; 

void main() 
{ 
    vec2 coord = vec2(0.5, 0.5); 

    //gl_FragColor = vec4(coord, 0.0, 1.0); 

    gl_FragColor = vec4(texture2D(texture, coord).rgb, 1.0); 
} 

我知道一些这个代码的可能是没有必要的,但我一直在尝试一切我能想到的。

谢谢。

+1

顺便说一句,总是用glGetError检查错误。如果您有错误,渲染可能会消失。 – alxx 2010-10-13 08:25:20

回答

3

最可能的原因是,您没有关闭mipmap,并且没有指定mipmapping级别。所以你的纹理是不完整

要关闭此纹理对象(被周围的glTexImage2D调用来完成)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

但你一定要明白,“一切打破了”没有在所有帮助搞清楚你看到了什么?一般来说,一个截图胜过千言万语,但短了,至少描述如何它失败会有所帮助。

+0

这正是我的问题。我不敢相信这很简单。我已经在这工作了两天了。我上面的意思是,渲染窗口只显示背景颜色,没有别的,下次我提问时,我会记住你的建议。哦,你可能想编辑你的答案,所以它有GL_TEXTURE_2D作为第一个参数。再次感谢。 – LandonSchropp 2010-10-13 08:04:48

+0

@ helixed:你说得对。完成。 – Bahbar 2010-10-13 08:06:46

+0

@helixed:同样,只有背景颜色很奇怪,因为当你有不完整的纹理时,你应该看到多边形,就好像纹理未启用。背景颜色是黑色的吗? (选择明显不同的背景色也是一个好主意) – Bahbar 2010-10-13 08:16:24