是否可以在片段着色器中获取缠绕顺序?

Is it possible to get the winding order in the fragment shader?

我目前在 Android 上使用 OpenGL ES 2.0,我发现它是一个非常昂贵的解决方案(在我的例子中)为每个顶点甚至每个片段存储一个法向量。我想确定片段着色器中三角形的朝向,只有顶点的位置属性(如果有帮助的话还有 UV 坐标)。 有没有办法实现这个?据我所知,OpenGL 知道三角形的缠绕顺序并在渲染时利用它,但是,我没有找到任何解决方案来接收此信息。

OpenGL 使用缠绕顺序来确定三角形的面向,因此当启用面剔除时,不可见的面根本不会被光栅化。但是,您的顶点着色器对于每个顶点都是 运行,并且由于 GPU 的并行特性,您无权访问其他顶点。

使用几何着色器可以访问同一图元中的其他顶点。如果我没记错的话,它可以作为 OpenGL ES 3.1 的扩展使用,但之前不能使用。

是的,为此有一个内置变量。它名为 gl_FrontFacing,类型为 bool

例如,如果您想要将正面三角形着色为黄色,将背面三角形着色为青色,您可以在片段着色器中使用以下内容:

if (gl_FrontFacing) {
    gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
} else {
    gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0);
}