我通过编译自己的二进制文件来使用ASSIMP 4.0.1。我不断错误地加载法线。我已经将我的cube.obj减少到只有一个三角形...我想确认它做错了,我不是疯了。最后,我如何解决它也是一个问题。这是OBJ文件的样子:
struct failure { };
template <class F, size_t... Is, typename... Tags>
void match(F f, size_t i, std::index_sequence<Is...>, Tags... tags) {
auto inner = [&](auto tag) { f(tag); return true; };
bool matched = ((i == Is && inner(tags)) || ...);
if (!matched) {
f(failure{});
}
}
template <typename... Ts>
void foo(int index) {
match<Ts...>(overload(
[](auto tag){
std::cout << typeid(typename decltype(tag)::type).name() << std::endl;
},
[](failure ) { /* ... */ }
), index);
}
现在给出了最后一行,我正在加载一个带有属性的三角形:
我正在绘制的是三角形的法线,这清楚地表明它是(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?我正在使用以下顶点和片段着色器:
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
-
#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;
}
答案 0 :(得分:3)
此时,我怀疑这个obj文件不正确?注意最后一个法线,(数字3),为什么(0.0,0.0,-1.0)?
为什么这么说?你的OBJ文件定义了一个三角形,其中所有3个顶点共享正常1(在OBJ中基于一个索引),显然是(0,0,1)
,也是assimp加载的。
Wavefront OBJ使用惯例
vertex/texcoord/normal
而不是vertex/normal/texcoord
正如您所期待的那样。