其任务是:着色器获取一个恒定的颜色,然后根据它们的位置生成像素颜色,用纹理坐标替换两个颜色分量(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不允许"colorxIndex = uv.x“。
目前,我已经用了一堆如果-否则的丑陋的方式。但我觉得有一些交叉乘积或矩阵乘法的解。有什么想法吗?
发布于 2014-10-17 08:28:25
你可以用另外两个矢量作为通道掩码。它的工作原理类似于索引,但使用的是向量运算符。
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)根据需要构建正确的代码。
https://stackoverflow.com/questions/26367494
复制相似问题