【问题标题】:Cell shading effect in OpenGL ES 2.0/3.0OpenGL ES 2.0/3.0 中的单元格着色效果
【发布时间】:2020-06-02 20:44:29
【问题描述】:

我将单元格阴影效果应用于对象,例如:

这很好用,但是片段着色器中有很多条件检查(“if”语句):

#version 300 es
precision lowp float;

in float v_CosViewAngle;
in float v_LightIntensity;

const lowp vec3 defaultColor = vec3(0.1, 0.7, 0.9);

void main() {
    lowp float intensity = 0.0;
    if (v_CosViewAngle > 0.33) {
        intensity = 0.33;
        if (v_LightIntensity > 0.76) {
            intensity = 1.0;
        } else if (v_LightIntensity > 0.51) {
            intensity = 0.84;
        } else if (v_LightIntensity > 0.26) {
            intensity = 0.67;
        } else if (v_LightIntensity > 0.1) {
            intensity = 0.50;
        }
    }
    outColor = vec4(defaultColor * intensity, 1.0);
}

我猜片段着色器中的大量检查最终会影响性能。此外,着色器大小正在增加。特别是如果会有更多的单元格阴影级别。

还有其他方法可以达到这种效果吗?也许可以在这里使用一些 glsl 函数?

提前致谢!

【问题讨论】:

    标签: android opengl-es glsl shader opengl-es-3.0


    【解决方案1】:

    将您的色带存储在 Nx1 纹理中,使用 v_LightIntensity 作为纹理坐标进行纹理查找。想要不同的着色级别计数,然后只需更改纹理即可。

    EDIT 存储 NxM 纹理,使用 vLightIntensityv_CosViewAngle 作为 2D 坐标进行查找,您可以完全杀死分支。

    【讨论】:

    • 一个有趣的解决方案。谢谢你!
    • @alexrnov 为了提高效率,您应该避免使用dependent texture read。基本上,不要将 v_CosViewAnglev_LightIntensity 作为两个单独的浮点变量传递,而是确保将纹理坐标作为 vec2 传递并在未修改的情况下使用它们。
    • @Columbo 谢谢!我会考虑到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多