【发布时间】: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 相当大,纹理有边界或某种渐变,而您看到的只是夹紧的结果?