OpenGL ES 2.03.0中的单元格阴影效果

问题描述 投票:0回答:1

我在对象上应用了单元格阴影效果,比如。

enter image description here

这很好用,但片段着色器中有很多条件检查("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);
}

我猜在片段着色器中的这么多检查最终会影响性能。此外,shader的大小也在增加。特别是如果会有更多的单元着色层。

有没有其他方法可以得到这种效果?也许这里可以使用一些glsl-function?

先谢谢你

android opengl-es glsl shader opengl-es-3.0
1个回答
2
投票

将你的颜色带存储在Nx1纹理中,使用v_LightIntensity作为纹理坐标进行纹理查找。想要一个不同的阴影等级数,那么只需要改变纹理。

EDIT 存储一个NxM纹理,用NxM纹理来做查找。vLightIntensityv_CosViewAngle 作为一个二维坐标,你可以完全杀死分支。

© www.soinside.com 2019 - 2024. All rights reserved.