簡體   English   中英

通過ASSIMP了解OBJ加載

[英]Understanding OBJ loading via ASSIMP

我通過編譯自己的二進制文件來使用ASSIMP 4.0.1。 我一直沒有正確加載法線。 我已將我的cube.obj減小到僅一個三角形...,我想確認它做錯了並且我不是瘋了。 最后,我該如何解決它也是一個問題。 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

現在給出最后一行,我正在加載具有屬性的單個三角形:

裝樣

我正在繪制的是三角形的法線,這顯然是(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是綠色而不是綠色,而頂點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;
}

此時,我懷疑此obj文件不正確? 注意最后一個法線(即3),為什么是(0.0,0.0,-1.0)?

為什么這么說 您的OBJ文件定義了一個三角形,其中所有3個頂點共享法線1(在OBJ中基於一個索引的索引中),顯然是(0,0,1) ,這也是assimp加載的內容。

Wavefront OBJ使用約定

vertex/texcoord/normal 

而不是您期望的vertex/normal/texcoord

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM