有可能在碎片着色器中获得缠绕顺序吗?



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

是的,有一个内置变量。命名为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);
}

OpenGL使用缠绕顺序来确定三角形的面,因此当启用面剔除时,不可见的面根本不会光栅化。然而,你的顶点着色器是为每个顶点运行的,由于GPU的并行特性,你不能访问其他顶点。

使用几何着色器可以访问相同原语中的其他顶点。如果我没弄错的话,它可以作为OpenGL ES 3.1的扩展,但在此之前不行。

最新更新