私は現在、API の使用方法を学習する試みとして、OpenGL で小さなゲームを作成しようとしています。単純なシーンでカメラを動かし、モデルをレンダリングして単純な 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 ローダーにすべての頂点属性を出力させ、これらを .obj ファイルのインデックスと比較しました。verecies、法線、UV が正しい順序で表示されているように見えます。
スクリーンショット
シーンは、単純な reg から緑へのグラデーションをテクスチャ イメージとして使用すると、次のようになります。
(私の理解では、正方形はテクスチャからのグラデーションを表示する必要がありますか?単色だけではありません)
アライメントは欠陥の可能性があるように聞こえますが、これを修正するにはどうすればよいですか?
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;