Opengl 低多边形圆锥体-尖端平滑着色
如果将圆柱体细分为8面棱柱体,根据顶点法线的位置(“平滑着色”)计算顶点法线,效果会非常好 如果将圆锥体细分为8边棱锥体,根据法线的位置计算法线,则会卡在圆锥体的尖端上(从技术上讲是圆锥体的顶点,但我们称其为尖端以避免与网格顶点混淆) 对于每个三角形面,您希望沿两条边匹配法线。但由于只能在三角形的每个顶点指定一条法线,因此可以匹配一条边或另一条边,但不能同时匹配两条边。可以通过选择两条边的平均值作为“尖端法线”进行折衷,但现在没有一条边看起来很好。下面是为每个顶点选择平均法线的详细信息 在一个完美的世界里,GPU可以光栅化一个真正的四边形,而不仅仅是三角形。然后,我们可以使用退化四边形指定每个面,允许我们为每个三角形的两个相邻边指定不同的法线。但我们要做的只是三角形。。。我们可以将圆锥体切割成多个“堆叠”,这样边缘不连续性只在圆锥体的顶端可见,而不是沿着整个圆锥体可见,但仍然会有一个尖端Opengl 低多边形圆锥体-尖端平滑着色,opengl,3d,geometry,directx,mesh,Opengl,3d,Geometry,Directx,Mesh,如果将圆柱体细分为8面棱柱体,根据顶点法线的位置(“平滑着色”)计算顶点法线,效果会非常好 如果将圆锥体细分为8边棱锥体,根据法线的位置计算法线,则会卡在圆锥体的尖端上(从技术上讲是圆锥体的顶点,但我们称其为尖端以避免与网格顶点混淆) 对于每个三角形面,您希望沿两条边匹配法线。但由于只能在三角形的每个顶点指定一条法线,因此可以匹配一条边或另一条边,但不能同时匹配两条边。可以通过选择两条边的平均值作为“尖端法线”进行折衷,但现在没有一条边看起来很好。下面是为每个顶点选择平均法线的详细信息 在一
有人对平滑着色的低多边形圆锥体有什么窍门吗?是的,这当然是三角形的限制。我认为,当你从圆柱体接近圆锥体时,显示问题会让问题变得非常清楚: 这里有一些你可以尝试的东西
in vec2 coneSlope; //normal x/z magnitude and y
in vec3 objectSpaceFragPos;
uniform mat3 normalMatrix;
void main()
{
vec3 osNormal = vec3(normalize(objectSpaceFragPos.xz) * coneSlope.x, coneSlope.y);
vec3 esNormal = normalMatrix * osNormal;
...
}
也许你也可以用一些花哨的技巧来减少碎片着色器的操作。
然后是细分更多着色器与更昂贵着色器之间的整体平衡圆锥体是一个相当简单的物体,虽然我喜欢这个挑战,但在实践中,我不认为这是一个问题,除非你想要很多圆锥体。在这种情况下,您可能会进入几何体着色器或实例化。更好的是,可以在片段着色器中使用四边形和光线投射隐式圆锥体绘制圆锥体。如果圆锥体都在一个平面上,你可以尝试法线贴图,甚至视差贴图。我在现代OpenGL(即着色器)中努力使用由三角形组成的圆锥体,但后来我发现了一个非常简单的解决方案!我想说,这比目前被接受的答案中的建议要好得多,也简单得多 我有一个三角形阵列(显然每个三角形有3个顶点),它们形成了锥形曲面。我不关心底面(圆形底座),因为这非常简单。在我的所有工作中,我使用以下简单的顶点结构:
(通过添加1.0f作为最后一个元素,在着色器中自动转换为vec4)位置:vec3
(在着色器中保持为vec3,因为它用于计算与灯光方向的点积)法线_向量:vec3
(我没有使用透明度)color:vec3