在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();顶点指的是这个结构:
struct Vertex{
glm::vec3 Pos;
glm::vec3 Normal;
glm::vec2 TextureCoords;
}; 变量m是一个网格类的实例,它包含一个顶点的std::vector和一个std::vector索引以及相应的getter。
在摆弄了网格本身之后,我意识到这可能是一个UV问题,因为对象现在看起来是这样的:

在浏览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坐标渲染为红色和绿色后,我得到了以下结果。

发布于 2015-09-27 05:08:41
似乎其中一个问题是土壤本身的问题。我自己设置纹理状态,而不是让土壤来做,似乎解决了这个问题。现在,纹理显示为正常显示。问题可能出在函数"SOIL_load_OGL_texture“中的某个地方。取而代之的是,在我生成纹理之前,我只要求SOIL将图像加载到内存中。
https://stackoverflow.com/questions/32704593
复制相似问题