HLSL Pixel Shader - 更改特定色调的图像颜色
我想编写一个像素着色器,它获取输入图像,并将一个色调范围(即 HSV)的所有颜色转换为另一个色调范围。
我的动机很简单:我想对一堆不同的纹理进行不同的着色,但我不想对整个纹理进行着色,而只是对色调在特定范围内的部分进行着色。这样,我可以绘制一辆赛车的图像,然后使用像素着色器仅更改汽车上的条纹和徽标的颜色。
我在线查看了 HLSL 文档,找不到任何处理色调的内容。是否有在线可用的 HLSL 代码库?
这是我想要完成的一些伪代码:
external float SrcMinHue,SrcMaxHue,TargetMin
void changeHues(image source)
{
foreach x,y in image:
{
float sourceHue = getHue(source,x,y)
if (SrcMinHue < sourceHue < SrcNaxHue):
setHue(source,x,y,(TargetMin + (sourceHue - MinHue))
}
}
我正在与 XNA Game Studio 合作,如果该信息对任何人都很重要。
I'd like to write a pixel shader that takes an input image, and converts all of the colors of one Hue range (i.e. HSV) into another Hue Range.
My motivation is simple: I want to color a bunch of different textures differently, but i don't want to color the entire texture, just the portion with a hue in a specific range. That way, I can draw one image of a racing car, and then change the color of just the stripes and the logo on the car with a pixel shader.
I looked at the HLSL documentation online and couldn't find anything to deal with hues. Is there a library of HLSL code available online?
Here's some pseudocode for what i'm trying to accomplish:
external float SrcMinHue,SrcMaxHue,TargetMin
void changeHues(image source)
{
foreach x,y in image:
{
float sourceHue = getHue(source,x,y)
if (SrcMinHue < sourceHue < SrcNaxHue):
setHue(source,x,y,(TargetMin + (sourceHue - MinHue))
}
}
I'm working with XNA Game Studio, if that information matters to anyone.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
查看 NVidia 着色器库中的 “post RGB to HSV”示例页面。这可能会给你一些启发。
否则我想你可以使用来自维基百科的公式在像素着色器中“简单地”将RGB颜色转换为HSV< /a> 然后从那里获取它。
Take a look at the "post RGB to HSV" sample over at the NVidia Shader Library page. That might give you some inspiration.
Otherwise I guess you could "simply" convert an RGB color to HSV in your pixel shader using the formula from Wikipedia and then take it from there.
创建一个矩阵,将 RGB 颜色围绕 [1,1,1] 轴(亮度轴)* 旋转一定角度,从而将源颜色旋转到目标颜色。将此矩阵设置为像素着色器常量。
在像素着色器中,通过该矩阵变换像素颜色。然后,根据未变换像素的色调和源颜色的色调之间的角度,在未变换和变换的颜色之间进行 lerp。当角度较小时,使用变换后的颜色。当角度较大时,使用未变换的颜色。
要确定像素的色调,请从该像素中减去其 RGB* 的平均值。该向量与 [1,0,0] 之间的角度就是色调。
*我知道亮度并不是这么简单,但对于这种情况来说,这是一个足够好的近似值。
Make a matrix that rotates an RGB color around the [1,1,1] axis (the luminance axis)* by an angle that would rotate your source color onto your target color. Set this matrix as a pixel shader constant.
In the pixel shader, transform the pixel color by this matrix. Then, lerp between the untransformed and transformed colors, according to the angle between the untransformed pixel's hue and the source color's hue. When the angle is small, use the transformed color. When the angle is large, use the untransformed color.
To determine the hue of a pixel, subtract the average of its RGB* from the pixel. The angle between this vector and [1,0,0] is the hue.
*I'm aware that luminance is not this simple, but this is a good enough approximation for this case.
色相/饱和度/亮度/对比度 HLSL 像素着色器 (shazzam .fx)
Hue/Saturation/Brightness/Contrast HLSL pixel shader (shazzam .fx)
看看
take a look at