OpenGL ES 2.0/3.0 中的单元格着色效果
Cell shading effect in OpenGL ES 2.0/3.0
我对对象应用了单元格阴影效果,例如:
这很好用,但是片段着色器中有很多条件检查("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 函数?
提前致谢!
将色带存储在 Nx1 纹理中,使用 v_LightIntensity 作为纹理坐标进行纹理查找。想要不同的着色级别计数,只需更改纹理即可。
编辑存储一个NxM纹理,使用vLightIntensity
和v_CosViewAngle
作为二维坐标进行查找,你可以完全杀死分支。
我对对象应用了单元格阴影效果,例如:
这很好用,但是片段着色器中有很多条件检查("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 函数?
提前致谢!
将色带存储在 Nx1 纹理中,使用 v_LightIntensity 作为纹理坐标进行纹理查找。想要不同的着色级别计数,只需更改纹理即可。
编辑存储一个NxM纹理,使用vLightIntensity
和v_CosViewAngle
作为二维坐标进行查找,你可以完全杀死分支。