我试图找出如何正确地实现网格的平面阴影包含非平面多边形(使用OpenGL/GLSL)。目的是获得类似于Blender给出的结果(下面所有的多边形都是非平面的):
提供一些上下文-非平面多边形(例如四角,五角,.)是否存在于网格I加载中,或由于将细分方案(如Catmull)应用于网格而出现。
在三角形网格的情况下,我知道以下实现平面阴影的方法-
dFdx
和dFdy
在破片着色器中的交叉积计算glDrawElements
时,使用flat
插值限定符(它基本上使用与所有片段的激发顶点相关联的法线)。glDrawArrays
时,大多数顶点(通常都是)被多次复制到GPU。因此,每次都可以使用不同的正常值。对于包含非平面多边形的网格,前三个选项不会产生我想要的结果。在我的实现中(使用Qt框架),我使用GL_TRIANGLE_FAN
:
第四种选择可能有效,但不是很优雅--我想使用glDrawElements
或glDrawMultiElements
。另一种选择是在逐个遍历faces时使用glDrawElements
(而不是使用glPrimitiveRestartIndex
调用一次)。在这种情况下,一个人可以上传一个uniform
正常的每张脸。然而,这似乎不太有效。还有其他想法吗?
发布于 2016-01-13 14:29:53
不知道搅拌机的内部,我会说它使用共享法线为四角,分裂法线只在边缘之间的四角,而不是在三角形之间。因此,您的想法上传一个正常的每四元可能是接近的结果,你正在寻找。
如果将网格加载为四角体,则设置。如果您使用的是OpenGL的旧版本,其中仍然存在四叉元,那么甚至可以使用解决方案3)。
如果将网格加载为三角形,则必须确定哪些三角形起源于四角体。你很可能只是通过在相邻三角形之间的固定角度之外强制分割法线来做到这一点。
我不确定有一个简单的动态解决方案,你只是渲染任何网格。你可以使用几何图形着色器查看相邻的顶点,但最简单的版本是在上传之前平滑法线一次。
https://computergraphics.stackexchange.com/questions/1888
复制相似问题