OpenGL4.5中顶点数少于基元数时的逐基元法线处理

tjrkku2a  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(123)

我遇到了一点麻烦,要找到一个解决方案,将正确的法线传递给OpenGL4.5中的片段着色器,使每个三角形图元在进行索引三角形渲染时能够使用每个三角形的法线。(我想使用IBO)
我目前的解决方案,对一些模型的工作是基本上设置每个图元的第一个顶点是挑起顶点,并有图元的法线被视为法线从挑起顶点。(当然添加平面修改器的法线属性着色器)
这应该适用于大多数模型,但我意识到,当模型中的三角形图元多于顶点时,它就不起作用了。我能想到的最简单的例子是三角双锥。
OpenGL行业中,是否有一种典型的方法来实现这一点?在行业中,模型是否足够大,以至于每个顶点的法线更容易实现,看起来更好?

jfewjypa

jfewjypa1#

正如其他评论中提到的,“业内人士”经常会复制法线不连续的顶点。当你的几何体只有一部分是平面着色的,而另一部分是平滑的,或者有折痕时,这是不可避免的。
如果几何体完全为平面着色,则可以执行的另一项操作是使用gl_PrimitiveID从片段着色器中的SSBO获取每基本体法线:

layout(std430, binding = 0) buffer NormalsBuffer {
    vec4 NORMALS[];
};

void main() {
    vec3 normal = NORMALS[gl_PrimitiveID].xyz;
    // ...
}

您还可以使用unpackSnorm2x16或类似的函数来读取存储在较小数据类型中的法线,从而减少带宽,这与顶点数组属性非常相似。

相关问题