【问题标题】:opengl 3.1 textures not loadingopengl 3.1 纹理未加载
【发布时间】:2013-11-27 04:31:53
【问题描述】:

我一直在尝试在 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, &texture); glBindTexture(GL_TEXTURE_2D, 纹理);

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);

【问题讨论】:

  • 你是如何创建cubeVAO的?
  • “纹理中的一些颜色将被加载”让我认为纹理坐标定义不明确 - 所以有时你会看到纹理的一部分(可能是单个纹素)在整个三角形。
  • 还值得考虑:intel 芯片组支持哪些 opengl 扩展?我喜欢 GLView,因为它可以快速轻松地发现所支持的合规级别
  • 是否每次运行都会产生相同的错误结果,还是每次运行都会产生不同的结果,即使您没有更改任何代码?
  • 我认为 texture2D 在较新的 OpenGL 版本中已被弃用并被 texture 取代,也许您可​​以尝试更改它?

标签: c++ opengl glsl


【解决方案1】:

您尚未显示确定verttexprog 值的代码。根据您目前的代码,我必须假设 verttexprog(顺便说一句,这是一个糟糕的变量名)未初始化。

链接程序后,您应该将verttexprog 初始化为glGetAttribLocation (program, "vertTextCoord");。同样,不要在每帧查询统一的位置,它们唯一的变化是在你(重新)链接一个 GLSL 程序之后。


您的纹理已正确加载,但您的纹理坐标未正确加载。如果您想看到这一点,您可以替换:
finalColor = texture(tex, fragTexCoord);

与:

finalColor = texture(tex, gl_FragCoord.st);

这不是您想要的行为,但它是显示您的纹理加载正常的好方法。

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-06-11
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多