繁体   English   中英

创建高效的纹理重着色片段着色器

[英]Creating an efficient texture recoloring fragment shader

我正在尝试创建一个片段着色器,以便为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)。

任何帮助将是巨大的!

我将执行以下操作:计算完全重新着色的像素,然后基于函数与原始像素混合。 这是一个主意:

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);

让我知道是否可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM