我目前正在尝试在OpenGL中制作一个小游戏,以尝试学习如何使用API。我已经到了一个可以在一个简单的场景周围移动相机的地方,我可以使用一个简单的phong模型着色器渲染模型和阴影。
我现在正在对场景中的模型进行纹理处理,所以我得到了一个Maya的副本,并且(在相当困难的情况下)制作了一个带有纹理的正方形,并在Maya中制作了UV贴图。
当我渲染场景时,会应用纹理,但远非正确。我用我自己编写的解析器将模型读作.obj文件,并使用我在网上找到的功能读取纹理。
我不确定如何详细描述问题,也不知道在代码中要查找什么,但是这里有一些我怀疑会包含问题的代码部分。
阅读纹理
GLuint loadTexture(Image* image){
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGB,
image->width, image->height,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
image->pixels);
return textureId;
}
在渲染网格之前设置纹理
// set texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, this->body_texture);
current_shader->setUniformint(0, "Difuse_texture");
顶点着色器
#version 410
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec3 VertexNormal;
layout(location = 1) in vec2 TextureCoord;
out vec3 Position;
out vec3 Normal;
out vec2 TexCoord;
uniform mat4 ModelMatrix;
uniform mat4 VeiwMatrix;
uniform mat4 ProjectionMatrix;
uniform mat3 NormalMatrix;
void main(){
mat4 ModelVeiwMatrix = VeiwMatrix * ModelMatrix;
mat4 MVP = ProjectionMatrix * ModelVeiwMatrix;
TexCoord = TextureCoord;
Normal = normalize( NormalMatrix * VertexNormal );
Position = vec3(ModelVeiwMatrix * vec4(VertexPosition, 1.0));
gl_Position = MVP * vec4(VertexPosition, 1.0);
}
片段着色器
#version 410
in vec3 Position;
in vec3 Normal;
in vec2 TexCoord;
uniform vec4 LightPosition;
uniform vec3 LightIntensity;
uniform vec3 Kd;
uniform vec3 Ka;
uniform vec3 Ks;
uniform float Shininess;
uniform sampler2D Difuse_texture;
layout(location = 0) out vec4 FragColor;
vec4 ads(){
vec3 n = normalize( Normal );
vec3 s = normalize( vec3(LightPosition) - Position );
vec3 v = normalize( vec3(-Position) );
vec3 r = reflect( -s, n );
vec3 specular_light = Ks * pow(max(dot(r, v), 0.0), Shininess);
vec3 ad_light = Ka + Kd * max(dot(s, n), 0.0);
vec4 TexColor = texture2D(Difuse_texture, TexCoord);
return TexColor; // (vec4(LightIntensity, 1.0) * (vec4(ad_light, 1.0) * TexColor + vec4(specular_light, 1.0)));
}
void main() {
FragColor = ads();
}
我知道有些事情写的很奇怪,但此时我才开始尝试任何事情让它发挥作用。
有没有人建议如何解决这种奇怪的UV映射?
编辑:
OBJ LOADING
我已经让obj加载器打印了所有顶点属性,并将它们与.obj文件中的索引进行了比较。看起来verecies,normals和UVs以正确的顺序显示。
截图
场景看起来就是这样,只使用简单的绿色渐变作为trexture图像。
(方形应该由我的下方显示纹理的渐变?而不仅仅是单一颜色)
对齐听起来像是一个可能的缺陷,我怎么能纠正这个?
a http://imageshack.com/a/img674/9927/y0bJ51.png
解
我犯了一个非常简单易被忽视的错误。在我写的顶点着色器的顶部
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec3 VertexNormal;
layout(location = 1) in vec2 TextureCoord;
所以我想当我将普通数据发送到位置1时,我将纹理坐标设置为普通数据,因此UV坐标从未到达片段着色器。
更改为以下内容解决了问题而无需进一步更改。
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec3 VertexNormal;
layout(location = 2) in vec2 TextureCoord;