【问题标题】:Opengl Texture Colour ErrorOpengl 纹理颜色错误
【发布时间】:2015-09-21 21:07:22
【问题描述】:

当在 opengl 中将纯绿色纹理渲染到屏幕上时,网格在应用纹理的情况下正确渲染,但只有部分纹理被正确着色(这也发生在其他纹理上)。纹理的其余部分与预期的颜色不同

它应该与对象右上角的颜色相同。

使用简单的开放式 GL 图像库加载的纹理:

textureID = SOIL_load_OGL_texture(name.c_str(), SOIL_LOAD_AUTO,SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y );

基本片段着色器:

#version 330

in vec2 FragmentUV;

out vec4 Colour;

uniform sampler2D MainTexture;

void main(){

    Colour = texture(MainTexture, FragmentUV);

}

绑定纹理并在着色器中设置采样器:

glActiveTexture(GL_TEXTURE0 + textureUnit);
glBindTexture(GL_TEXTURE_2D, t.textureID);

int location = glGetUniformLocation(programID, u.c_str());
glUniform1i(location, textureUnit);

我完全不知道是什么原因造成的。

编辑:

分配纹理坐标和其他顶点信息的代码

    //generate and bind vertex array
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    GLErrorCheck();

    //vertex data
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, m.GetVerticies().size() * sizeof(Vertex), m.GetVerticies().data(), GL_STATIC_DRAW);
    GLErrorCheck();

    //index data
    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, m.GetIndicies().size() * sizeof(GLuint), m.GetIndicies().data(), GL_STATIC_DRAW);
    GLErrorCheck();

    glEnableVertexAttribArray(0);//Vertex Position
    glEnableVertexAttribArray(1);//Vertex Normal
    glEnableVertexAttribArray(2);//Vertex Tex Coords
    GLErrorCheck();

    //setup vertex info
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Pos));
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal));
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, TextureCoords));
    GLErrorCheck();

    //unbind the vertex array
    glBindVertexArray(0);
    GLErrorCheck();

Vertex 指的是这个结构:

struct Vertex{
    glm::vec3 Pos;
    glm::vec3 Normal;
    glm::vec2 TextureCoords;
}; 

变量 m 是一个网格类的实例,它包含一个 std::vector 顶点和一个 std::vector 索引和相应的 getter。

在摆弄了网格本身之后,我意识到这可能是一个 UV 问题,因为对象现在看起来像这样:

查看 cube.obj 文件时,我注意到纹理坐标看起来不正常。立方体本身只是简单地从搅拌机中导出并通过 assimp 加载到应用程序中。

vt 0.999820 0.000180
vt 0.666847 0.000180
vt 0.666847 0.333153
vt 0.999820 0.333153
vt 0.666486 0.333514
vt 0.333514 0.333514
vt 0.333514 0.666486
vt 0.666486 0.666486
vt 0.000180 0.666486
vt 0.333153 0.666486
vt 0.333153 0.999459
vt 0.000180 0.999459
vt 0.000180 0.333153
vt 0.333153 0.333153
vt 0.333153 0.666126
vt 0.000180 0.666126
vt 0.666486 0.333153
vt 0.666486 0.000180
vt 0.333514 0.000180
vt 0.333514 0.333153
vt 0.000180 0.000180
vt 0.333153 0.000180

尝试将 UV 坐标渲染为红色和绿色后,我得到了这个结果。

【问题讨论】:

  • 你可以检查一下,是纹理还是其他问题。简单地将着色器主体替换为:Color = vec4(0.0, 1.0, 0.0, 1.0);
  • 可能应该提出我已经尝试过的问题。如果您对颜色进行硬编码,它会按预期工作。
  • 我还在 opengl 调试器中检查了纹理,证明纹理已正确加载到纹理单元中。
  • 你是如何分配纹理坐标的?我没有看到任何这样做的东西。
  • 会不会是 UV 相当大,纹理有边界或某种渐变,而您看到的只是夹紧的结果?

标签: c++ opengl textures


【解决方案1】:

问题之一似乎与 SOIL 本身有关。自己设置纹理状态而不是让 SOIL 来做似乎可以解决问题。现在纹理似乎正常显示。问题可能在函数“SOIL_load_OGL_texture”内部的某个地方。相反,现在我只是在生成纹理之前让 SOIL 将图像加载到内存中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多