我在Java(lwjgl)中为项目做一些OpenGL工作,其中一部分包括以OBJ格式导入3d模型。一切看起来好,直到我试图移动顶点,然后模型分解,你可以看到它们。 这是来自搅拌机的Suzanne,紫外线贴图,具有完全黑色的纹理(为了能见度)。在碎片着色器中,我根据其法线与世界向上矢量之间的碎片角度为碎片添加一些白色:
到目前为止一切顺利。但是当我将一个小的Y分量位移应用到相同的顶点时,我希望看到这些面部“拉伸”。起来。相反,这种情况发生了:
顶点着色器:
#version 150
in vec3 position;
in vec2 texCoords;
in vec3 normal;
void main()
{
vertPosModel = position;
cosTheta = dot(vec3(0.0, 1.0, 0.0), normal);
if(cosTheta > 0.0 && cosTheta < 1.0)
vertPosModel += vec3(0.0, 0.15, 0.0);
gl_Position = transform * vec4(vertPosModel, 1.0);
}
片段着色器:
#version 150
uniform sampler2D objTexture;
in vec2 texcoordOut;
in float cosTheta;
out vec4 fragColor;
void main()
{
fragColor = vec4(texture(objTexture, texcoordOut.st).rgb, 1.0) + vec4(cosTheta);
}
答案 0 :(得分:3)
因此,您的算法会根据从顶点法线求出的属性来偏移顶点的位置。如果您的网格完全平滑,这将只生成连接的网格。也就是说,在两个三角形相遇的情况下,共享顶点的法线在三角形的两边必须相同。
如果模型在曲面上具有不连续的法线,则在法线停止连续的任何地方都会出现断裂。也就是说,存在正常不连续性的边缘可能会断开连接。
我很确定Blender3D可以生成Suzanne的流畅版本。那么......你生成了一个光滑的网格吗?还是面子?