我正在尝试创建一个片段着色器来重新着色2D灰度精灵,但保留白色和近白色片段的完整性(即:不要重新着色纯白色片段,只能稍微重新着色近白色片段)。我不确定如何在不使用条件分支的情况下执行此操作,这会导致某些硬件上的性能不佳。
游戏引擎中的现有着色器只执行简单的乘法运算:
#ifdef GL_ES
precision lowp float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D CC_Texture0;
void main()
{
vec4 texColor = texture2D(CC_Texture0, v_texCoord);
gl_FragColor = texColor * v_fragmentColor;
}
我认为为了避免条件,我需要某种连续的数学函数来重新着色碎片,其RGB值大于(例如,0.9,0.9,0.9)小于小于(0.9,0.9,0.9)。
任何帮助都会很棒!
答案 0 :(得分:1)
我会这样做:计算完全重新着色的像素,然后根据功能与原始像素混合。这是一个想法:
vec4 texColor = texture2D(CC_Texture0, v_texCoord);
const vec4 kLumWeights = vec4(.2126, .7152, .0722, 0.0); // Rec. 709 luminance weights
float luminance = dot (texColor, kLumWeights);
vec4 recolored = texColor * v_fragmentColor;
const float kThreshold = 0.8;
float mixAmount = (luminance - kThreshold) / (1.0 - kThreshold); // Everything below kThreshold becomes 0, and from kThreshold to 1.0 becomes 0 to 1.0
mixAmount = clamp (mixAmount, 0.0, 1.0);
gl_FragColor = mix (recolored, texColor, mixAmount);
如果有效,请告诉我。