2016-04-27 69 views
1

我正在为一个项目在Java(lwjgl)中做一些O​​penGL的东西,其中一部分包括导入OBJ格式的3D模型。一切看起来好吧,直到我尝试顶点替换,然后模型分解,你可以看到他们通过。 这是来自搅拌机的苏珊娜(Suzanne),用完全黑色的纹理(为了能见度)映射了UV。在FRAG着色器,我加入了一些白色取决于其正常和世界上方向向量之间的片段角度的片段:顶点位移中断网格

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

请在你刚刚投票之前告诉我如何改善我的问题。不要成为懦夫。 – peanutops

回答

2

所以,你的算法抵消了顶点的位置的基础上,从顶点的衍生的特性正常。如果网格完全平滑,这将只产生一个连接的网格。也就是说,在两个三角形相交的地方,共享顶点的法线在三角形的两侧必须相同。

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

我很确定Blender3D可以生成Suzanne的平滑版本。所以......你生成了一个光滑的网格?或者它是多面的?

+0

如果您的意思是Blender中的左侧工具栏,您可以选择“平滑或平坦”阴影。我已经尝试了两种方法,但是如果它只改变法线方向,我看不出它是如何解决问题的,因为目前我没有使用法线进行任何照明计算(这在我的待办事项列表中)。 – peanutops

+0

@peanutops:正如我所说的,你正在使用法线进行*位置*计算。如果法线连接不好,则由它们计算出的*位置*也不会被连接。 –

+0

我想我需要重写我的.obj导入器,以便共享顶点将其面部法线合并到共享顶点法线中。我昨天做了类似的事情 - 从blender导出一个.x3d代替(法线列表是每个顶点不是按照每个顶点导出的),但是在读完一个vbo后,我的一半脸都失踪了,叹了一口气。 – peanutops