今天我决定学习一些关于着色器的知识,并且已经坚持了下来。我在HLSL为MonoGame写作。由于我在语言语义方面仍然存在问题,我不明白为什么它不起作用。
图像有许多区域,每个区域都有不同的颜色。我想在这些地区之间划定边界。
我期望的是:如果像素不在边界上,则替换给定的颜色(如果是单独的,则此部分工作正常),如果是边界,则将颜色设置为红色。
我得到的是:整个质地都是红色的
代码:
#if OPENGL
#define SV_POSITION POSITION
#define VS_SHADERMODEL vs_3_0
#define PS_SHADERMODEL ps_3_0
#else
#define VS_SHADERMODEL vs_4_0_level_9_1
#define PS_SHADERMODEL ps_4_0_level_9_1
#endif
sampler s0;
float4 selectedColor;
float4 PixelShaderFunction(float2 coords : TEXCOORD0) : COLOR0
{
float4 currentColor = tex2D(s0, coords);
float4 leftColor = tex2D(s0, coords - float2(1, 0));
float4 rightColor = tex2D(s0, coords + float2(1, 0));
float4 topColor = tex2D(s0, coords + float2(0, 1));
float4 bottomColor = tex2D(s0, coords - float2(0, 1));
bool isBorder = leftColor != currentColor ||
rightColor != currentColor ||
topColor != currentColor ||
bottomColor != currentColor;
if (isBorder)
{
currentColor = float4(1, 0, 0, 1);
}
else
{
bool isSame = (currentColor.r == selectedColor.r) && (currentColor.g == selectedColor.g) && (currentColor.b == selectedColor.b) && (currentColor.a == selectedColor.a); //,
if (isSame)
{
currentColor.rb = 0;
currentColor.g = 1;
}
else
{
currentColor.rgb = 1;
}
}
return currentColor;
}
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
我相信颜色的变化不应该影响下一个像素的检查,但也许我错了。
这个部分可以很好地替换适当的像素,所以它对图像分辨率或图像上的颜色值没有问题。
bool isSame = (currentColor.r == selectedColor.r) && (currentColor.g == selectedColor.g) && (currentColor.b == selectedColor.b) && (currentColor.a == selectedColor.a); //,
if (isSame)
{
currentColor.rb = 0;
currentColor.g = 1;
}
else
{
currentColor.rgb = 1;
}
编辑:
解决了!
对于float2中的着色器1(1,0)表示整个纹理的大小,所以必须对其进行分割。
详细信息:
https://community.monogame.net/t/how-do-i-use-shaders-to-create-border-around-a-sprite/11323