了解通过 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;
}
At this point, I'm suspecting that this obj file is incorrect? Notice the last normal, (number 3 that is), why is it (0.0, 0.0, -1.0) ?
为什么这么说?您的 OBJ 文件定义了一个三角形,所有 3 个顶点共享法线 1(在 OBJ 中基于一的索引),这显然是 (0,0,1)
,这也是 assimp 加载的内容。
Wavefront OBJ 使用约定
vertex/texcoord/normal
而不是您预期的 vertex/normal/texcoord
。
我通过编译我自己的二进制文件来使用 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;
}
At this point, I'm suspecting that this obj file is incorrect? Notice the last normal, (number 3 that is), why is it (0.0, 0.0, -1.0) ?
为什么这么说?您的 OBJ 文件定义了一个三角形,所有 3 个顶点共享法线 1(在 OBJ 中基于一的索引),这显然是 (0,0,1)
,这也是 assimp 加载的内容。
Wavefront OBJ 使用约定
vertex/texcoord/normal
而不是您预期的 vertex/normal/texcoord
。