首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有任意颜色分量的渐变生成着色器

具有任意颜色分量的渐变生成着色器
EN

Stack Overflow用户
提问于 2014-10-14 18:12:50
回答 1查看 1.1K关注 0票数 0

其任务是:着色器获取一个恒定的颜色,然后根据它们的位置生成像素颜色,用纹理坐标替换两个颜色分量(RGBA)。设置了硬编码组件后,如下所示:

代码语言:javascript
复制
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“。

目前,我已经用了一堆如果-否则的丑陋的方式。但我觉得有一些交叉乘积或矩阵乘法的解。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 08:28:25

你可以用另外两个矢量作为通道掩码。它的工作原理类似于索引,但使用的是向量运算符。

代码语言:javascript
复制
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)根据需要构建正确的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26367494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档