Opengl纹理颜色错误

时间:2015-09-21 21:07:22

标签: c++ opengl textures

当在opengl中向屏幕渲染纯绿色纹理时,网格会正确渲染纹理,但是只有纹理的一部分被正确着色(这也与其他纹理一样)。纹理的剩余部分处于与之相应的不同阴影中

enter image description here

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

用简单的开放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 of verticies和一个std :: vector标记以及相应的getter。

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

enter image description here

在查看cube.obj文件时,我注意到纹理坐标看起来不正常。多维数据集本身只是从blender导出并通过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坐标渲染为红色和绿色后,我得到了这个结果。

enter image description here

1 个答案:

答案 0 :(得分:0)

看来其中一个问题是SOIL本身。自己设置纹理状态而不是让SOIL这样做似乎解决了问题。现在纹理似乎正常显示。问题可能出在函数“SOIL_load_OGL_texture”中。相反,现在我只是要求SOIL在生成纹理之前将图像加载到内存中。