顶点位移破碎网格

时间:2016-04-27 19:22:35

标签: opengl glsl lwjgl

我在Java(lwjgl)中为项目做一些OpenGL工作,其中一部分包括以OBJ格式导入3d模型。一切看起来好,直到我试图移动顶点,然后模型分解,你可以看到它们。 这是来自搅拌机的Suzanne,紫外线贴图,具有完全黑色的纹理(为了能见度)。在碎片着色器中,我根据其法线与世界向上矢量之间的碎片角度为碎片添加一些白色:

enter image description here

到目前为止一切顺利。但是当我将一个小的Y分量位移应用到相同的顶点时,我希望看到这些面部“拉伸”。起来。相反,这种情况发生了:

enter image description here

顶点着色器:

#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);

}

1 个答案:

答案 0 :(得分:3)

因此,您的算法会根据从顶点法线求出的属性来偏移顶点的位置。如果您的网格完全平滑,这将只生成连接的网格。也就是说,在两个三角形相遇的情况下,共享顶点的法线在三角形的两边必须相同。

如果模型在曲面上具有不连续的法线,则在法线停止连续的任何地方都会出现断裂。也就是说,存在正常不连续性的边缘可能会断开连接。

我很确定Blender3D可以生成Suzanne的流畅版本。那么......你生成了一个光滑的网格吗?还是面子?