OpenGL纹理和UV贴图问题

时间:2014-11-03 20:14:28

标签: c++ opengl shader uv-mapping

我目前正在尝试在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;

0 个答案:

没有答案