2017-11-27 1 views
0

내 바이너리를 컴파일하여 ASSIMP 4.0.1을 사용하고 있습니다. 법선이 잘못로드되고 있습니다. 내 cube.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

이의 정상을 여기처럼 OBJ 파일이 어떻게 표시되는지를 보여줍니다 삼각형과 이것은 명확하게 그것이 녹색이기 때문에 그것이 (0.0, 1.0, 0.0)라고 말합니다. 삼각형은 x 축의 원점에서 -30.0f 떨어진 오프셋 (변환)으로 생성되고 정점 셰이더에서 프래그먼트 셰이더로 전달 된 법선으로 직접 음영 처리됩니다. 이 시점에서이 obj 파일이 올바르지 않은 것으로 의심됩니다. 마지막 노멀, (숫자 3), 왜 (0.0, 0.0, -1.0)입니까? 이것은 (0.0, 0.0, 1.0) (화면에서 바깥 쪽을 가리킴)이 아니어야합니까? 마지막으로 꼭지점 1에서 빨간색으로, 녹색에서 꼭지점 2로, 녹색은 꼭지점 3에서 검정으로 표시됩니다. 나는 다음과 같은 정점과 프래그먼트 쉐이더를 사용하고 있습니다 :

#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 (OBJs 1 기반 인덱싱에서)을 공유하는 3 개의 꼭지점 모두를 가진 삼각형을 정의합니다.

파면 OBJ는 대회

vertex/texcoord/normal 

당신이 기대하는 것 같이하지 vertex/normal/texcoord을 사용합니다.

+0

얼굴에 사용 된 주소 스키마와 관련하여 올바르지 않아서 내 게시물이 삭제되었습니다. 몇 년 전에 제가 구현 한 것을 잊어 버리십시오 :-). – KimKulling

+0

당신이 말한 것은 정확하지만 ASSIMP는 그렇지 않아야 할 때 꼭지점을 결합하는 것처럼 보입니다. 중복 제거 정점 플래그를 제거한 후에는 이제 괜찮습니다. – ChaoSXDemon

+0

그래서 어떤 꼭지점이 잘못 결합됩니까? – derhass

관련 문제