我有以下像素着色器(HLSL)编译为68条指令的问题(具有以下建议的优化)。但是,我想将它与着色器模型 2 一起使用,因此不幸的是我最多只能使用64条指令。有没有人在不改变着色器结果的情况下看到任何可能的优化?
着色器将屏幕的一个或多或少的球形区域(具有正弦形边框)从 RGB 转换为白色 -> 红色 -> 黑色的渐变,并进行一些额外的亮度等修改。
着色器代码是:
// Normalized timefactor (1 = fully enabled)
float timeFactor;
// Center of "light"
float x;
float y;
// Size of "light"
float viewsizeQ;
float fadesizeQ;
// Rotational shift
float angleShift;
// Resolution
float screenResolutionWidth;
float screenResolutionHeight;
float screenZoomQTimesX;
// Texture sampler
sampler TextureSampler : register(s0);
float4 method(float2 texCoord : TEXCOORD0) : COLOR0
{
// New color after transformation
float4 newColor;
// Look up the texture color.
float4 color = tex2D(TextureSampler, texCoord);
// Calculate distance
float2 delta = (float2(x, y) - texCoord.xy)
* float2(screenResolutionWidth, screenResolutionHeight);
// Get angle from center
float distQ = dot(delta, delta) - sin((atan2(delta.x, delta.y) + angleShift) * 13) * screenZoomQTimesX;
// Within fadeSize
if (distQ < fadesizeQ)
{
// Make greyscale
float grey = dot(color.rgb, float3(0.3, 0.59, 0.11));
// Increase contrast by applying a color transformation based on a quasi-sigmoid gamma curve
grey = 1 / (1 + pow(1.25-grey/2, 16) );
// Transform Black/White color range to Black/Red/White color range
// 1 -> 0.5f ... White -> Red
if (grey >= 0.75)
{
newColor.r = 0.7 + 0.3 * color.r;
grey = (grey - 0.75) * 4;
newColor.gb = 0.7 * grey + 0.3 * color.gb;
}
else // 0.5f -> 0 ... Red -> Black
{
newColor.r = 1.5 * 0.7 * grey + 0.3 * color.r;
newColor.gb = 0.3 * color.gb ;
}
// Within viewSize (Full transformation, only blend with timefactor)
if (distQ < viewsizeQ)
{
color.rgb = lerp(newColor.rgb, color.rgb, timeFactor);
}
// Outside viewSize but still in fadeSize (Spatial fade-out but also with timefactor)
else
{
float factor = timeFactor * (1 - (distQ - viewsizeQ) / (fadesizeQ - viewsizeQ));
color.rgb = lerp(newColor.rgb, color.rgb, factor);
}
}