代码之家  ›  专栏  ›  技术社区  ›  これは 聡明 な文章ã

使用着色器和MonoGame绘制颜色之间的边界

  •  0
  • これは 聡明 な文章だ · 技术社区  · 3 年前

    今天我决定学习一些关于着色器的知识,并且已经坚持了下来。我在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

    0 回复  |  直到 3 年前
    推荐文章