[英]Handling per-primitive normals when there are less vertices than primitives in OpenGL4.5
我在OpenGL 4.5 中想出了一个解决方案,将正确的法线传递给片段着色器,以便每个三角形图元能够在进行索引三角形渲染时使用每个三角形法线。 (我想使用 IBO)
我目前适用于某些模型的解决方案基本上是将每个图元的第一个顶点设置为激发顶点,并将图元的法线计为激发顶点的法线。 (当然是在shaders的normal属性上加上flat修饰符)
这应该适用于大多数模型,但我已经意识到,当 model 中的三角形基元多于顶点时,它就不起作用。我能想到的最简单的例子是三角双锥。
在OpenGL的行业中是否有典型的方法? 在工业中,模型是否大到每个顶点的法线更容易实现并且看起来更好?
正如其他人在评论中提到的那样,“在行业中”人们经常会复制具有不连续法线的顶点。 当您的几何体只有一部分是平坦的阴影并且部分是光滑的,或者其中有折痕时,这是不可避免的。
如果您的几何体完全是平面着色的,您可以做的另一种方法是使用 gl_PrimitiveID 从片段着色器中的gl_PrimitiveID
获取每个图元的法线:
layout(std430, binding = 0) buffer NormalsBuffer {
vec4 NORMALS[];
};
void main() {
vec3 normal = NORMALS[gl_PrimitiveID].xyz;
// ...
}
您还可以使用unpackSnorm2x16
或类似函数来读取存储在较小数据类型中的法线,从而减少带宽,就像顶点数组属性一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.