내 바이너리를 컴파일하여 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
이제 마지막 줄 주어, 나는 속성을 가진 하나의 삼각형로드 해요 : : 나는 그리기있어 무엇
이의 정상을 여기처럼 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;
}
얼굴에 사용 된 주소 스키마와 관련하여 올바르지 않아서 내 게시물이 삭제되었습니다. 몇 년 전에 제가 구현 한 것을 잊어 버리십시오 :-). – KimKulling
당신이 말한 것은 정확하지만 ASSIMP는 그렇지 않아야 할 때 꼭지점을 결합하는 것처럼 보입니다. 중복 제거 정점 플래그를 제거한 후에는 이제 괜찮습니다. – ChaoSXDemon
그래서 어떤 꼭지점이 잘못 결합됩니까? – derhass