2017-11-27 36 views
0

私自身のバイナリをコンパイルしてASSIMP 4.0.1を使用しています。法線が正しく読み込まれません。私は自分のcube.objをただ一つの三角形に縮小しました...そして、それが間違っていることを確認したい、そして私が気違いではないことを確認したいと思います。最後に、どのように修正することもできますか?ここでOBJファイルは次のようになります。今、最後の行を与えASSIMPによるOBJロードの理解

mtllib cube.mtl 
g cube Mesh 
usemtl cube Mesh_cube 

v -0.500000 -0.500000 0.500000 
v 0.500000 -0.500000 0.500000 
v -0.500000 0.500000 0.500000 
v 0.500000 0.500000 0.500000 
v -0.500000 0.500000 -0.500000 
v 0.500000 0.500000 -0.500000 
v -0.500000 -0.500000 -0.500000 
v 0.500000 -0.500000 -0.500000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 1.000000 0.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 -1.000000 0.000000 
vn 1.000000 0.000000 0.000000 
vn -1.000000 0.000000 0.000000 
vt 0.000000 0.000000 
vt 1.000000 0.000000 
vt 0.000000 1.000000 
vt 1.000000 1.000000 
f 1/1/1 2/2/1 3/3/1 

、私は属性を持つ単一の三角形をロードしています:

Loaded Sample

私が描いてる何ことの正常な動作です三角形とこれは明白にそれが(0.0,1.0,0.0)であると言います。それは緑色をRGBとしているからです。三角形は、x軸の原点から-30.0f離れたオフセット(平行移動)で作成され、頂点シェーダーからフラグメントシェーダーに渡された法線で直接陰影付けされます。この時点で、私はこのobjファイルが間違っている疑いがありますか?最後の法線(3の番号)、それはなぜ(0.0、0.0、-1.0)かを確認します。これは(0.0、0.0、1.0)ではないはずです(画面から外側を指しています)?最後に、なぜこの緑は頂点1から赤の代わりに、緑は頂点2に、頂点2では緑になるのですか?私は、次の頂点とフラグメントシェーダ使用しています:

#version 430 
in vec3 POSITION; 
in vec4 NORMAL; 
in vec2 TEXCOORD0; 

out vec4 normal; 
out vec2 uv0; 

uniform mat4 ModelMatrix; 
uniform mat4 ViewProjectionMatrix; 
uniform mat4 NormalMatrix; 
uniform vec3 CameraPosition; 

void main() 
{ 
    //normal = normalize(ModelMatrix * NORMAL); 
    normal = normalize(NORMAL); 
    uv0 = TEXCOORD0; 

    vec4 worldPosition = ModelMatrix * vec4(POSITION, 1.0); 
    //toCamera = normalize(CameraPosition - worldPosition.xyz); 

    gl_Position = ViewProjectionMatrix * worldPosition; 
} 

- この時点で

#version 430 
in vec4 normal; 
in vec2 uv0; 

out vec4 outFragColor; 

uniform sampler2D TEXTURE_0; 

uniform vec3 DirectionalLightDirection; 
uniform vec4 DiffuseReflectance; 
uniform float Shininess; 

//Blinn-Phong lighting ... TODO make this a macro 

float calculateDiffuseTerm(vec3 N, vec3 L) 
{ 
    return clamp(dot(N, L), 0.0, 1.0); 
} 

float calculateSpecularTermWithHalfVector(vec3 N, vec3 L, vec3 V) 
{ 
    float term = 0.0; 
    if(dot(N, L) > 0.0) 
    { 
     vec3 H = normalize(L+V); 
     term = pow(dot(N, H), Shininess); 
    } 
    return term; 
} 

void main() 
{ 
    //Calculate diffuse 
    vec4 textureColor = texture(TEXTURE_0, uv0); 

    vec3 directionalLight = -1.0 * DirectionalLightDirection; 
    float diffuseTerm = calculateDiffuseTerm(normalize(normal.xyz), directionalLight); 

    outFragColor = normalize(normal);// diffuseTerm * DiffuseReflectance; 
} 

答えて

3

を、私は、このOBJファイルが誤っていることを疑っていますか?最後の法線(3の番号)、それはなぜ(0.0、0.0、-1.0)かを確認します。

なぜあなたはそれを言いますか?あなたのOBJファイルは、明確に(0,0,1)であり、assimpがロードしたものでもある、通常の1(OBJの1ベースのインデックス付け)を共有する3つの頂点すべてを持つ三角形を定義します。あなたが期待するように見えるよう

波面OBJは大会

vertex/texcoord/normal 

なくvertex/normal/texcoordを使用しています。

+0

正直、顔に使われているアドレススキーマが間違っていたので、投稿を削除しました。私が何年も前に実装したことを忘れてしまいました。 – KimKulling

+0

あなたが言うことは正しかったですが、ASSIMPは、そうしてはならないときに頂点を結合するように見えます。だから、削除重複頂点フラグを削除した後、今は問題ありません。 – ChaoSXDemon

+0

どの頂点が誤って結合するのですか? – derhass

関連する問題