具有任意颜色分量的梯度生成着色器

时间:2014-10-14 18:12:50

标签: hlsl

任务是:着色器采用恒定颜色,然后通过用纹理坐标替换四个颜色分量中的两个(RGBA),根据它们的位置生成像素颜色。 使用硬编码组件集,它将类似于:

float4 inputColor : register(c0);

float4 main(float2 uv : TEXCOORD) : COLOR
{    
  float4 color = 0;

  color.a = inputColor.a;
  color.r = inputColor.r;
  color.g = uv.x;
  color.b = uv.y;

  return color;
}

现在我想传入一个参数,指定哪些组件应该用uv.x和uv.y替换。让我们说inputColor在这些组件中有-1和-2。或者有uint xIndex和yIndex参数指定要替换的vector4中的位置。 HLSL不允许" color [xIndex] = uv.x"。

目前我已经用一堆if-else以丑陋的方式做到了这一点。但我觉得有一些跨产品或矩阵乘法解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用另外两个向量作为channelmasks。它的工作方式与索引类似,但使用向量运算符。

float4 inputColor : register(c0);
float4 uvx_mask : register(c1); //e.g. (0,0,1,0)
float4 uvy_mask : register(c2); // e.g. (0,0,0,1)

float4 main(float2 uv : TEXCOORD) : COLOR
{    
  float4 color = 0;

  // replacing uvx channel with uv.x
  color = lerp(inputColor, uv.x * uvx_mask, uvx_mask); 
  // replacing uvy channel with uv.y
  color = lerp(color , uv.y * uvy_mask, uvy_mask);

  return color; //in this example (inputColor.r, inputColor.g, uv.x, uv.y)
}

如果您需要最后一点性能,您可以使用预处理器(#define,#ifdef)来替代构建正确的代码。