opengl 3.1纹理不加载
我一直在使用在ubuntu 13.04上运行的英特尔高清显卡2000/3000显卡上的opengl 3.1下的纹理工作。 我遇到的问题是纹理要么不加载,我试图纹理的基本三角形会变成黑色,或者来自纹理的某种颜色会加载,但不是整个图像。 我使用原始图像文件作为源代码或使用libjpeg加载jpeg获得相同的结果。
我的着色器如下所示:
顶点着色器
#version 130
in vec3 vert;
in vec2 vertTextCoord;
out vec2 fragTexCoord;
void main(){
fragTexCoord = vertTextCoord;
gl_Position = vec4(vert,1);
}
片段着色器
#version 130
uniform sampler2D tex;
in vec2 fragTexCoord;
out vec4 finalColor;
void main() {
finalColor = texture(tex, fragTexCoord);
}
用于创建纹理glGenTextures(1,&纹理)的代码; glBindTexture(GL_TEXTURE_2D,texture);
imgdata image_data = loadRaw("texture.bmp", 256, 256);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE,image_data.data);
和渲染功能
void display(void){
glClearColor( 1.f, 0.f, 0.f, 0.f);
glClear(GL_COLOR_BUFFER_BIT );
//load program to use
glUseProgram(shaderprogram);
GLint uniform = glGetUniformLocation(shaderprogram, "tex");
if(uniform == -1){
throw std::runtime_error(std::string("program uniform not found: tex"));
}
// bind the texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(uniform, 0);
//load vertex array to use
glBindVertexArray(cubeVAO);
//draw triangle
glDrawArrays(GL_TRIANGLES, 0, 3);
//unbind for next pass
glBindVertexArray(0);
glUseProgram(0);
glfwSwapBuffers();
}
几何和纹理坐标
GLfloat data[] = {
//X Y Z U V
0.0f, 0.8f, 0.0f, 0.5f, 1.0f,
-0.8f, -0.8f, 0.0f, 0.0f, 0.0f,
0.8f, -0.8f, 0.0f, 1.0f, 0.0f
};
VBO和VAO正在建立
glGenVertexArrays(1, &cubeVAO);
glBindVertexArray(cubeVAO);
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glEnableVertexAttribArray(vertprog);
glVertexAttribPointer(vertprog, 3, GL_FLOAT, GL_FALSE, 5*sizeof(GLfloat), NULL);
glEnableVertexAttribArray(verttexprog);
glVertexAttribPointer(verttexprog, 2, GL_FLOAT, GL_TRUE, 5*sizeof(GLfloat), (const GLvoid*)(3*sizeof(GLfloat)));
glBindVertexArray(0);
您没有在代码中确定verttexprog
的值。 从你当前的代码中,我必须假设verttexprog
( verttexprog
,这是一个糟糕的变量名)未初始化。
您应该将verttexprog
初始化为glGetAttribLocation (program, "vertTextCoord");
链接你的程序后。 同样,不要询问每个帧的统一位置,它们唯一的改变是在你重新链接GLSL程序之后。
您的纹理正在正确加载,但您的纹理坐标不是。 如果你想看到这个动作,你可以替换:
finalColor = texture(tex, fragTexCoord);
有:
finalColor = texture(tex, gl_FragCoord.st);
这不是你想要的行为,但它是显示你的纹理加载正常的好方法。
链接地址: http://www.djcxy.com/p/38541.html