C# 单游戏着色器移植问题

C# 单游戏着色器移植问题,c#,xna,shader,monogame,C#,Xna,Shader,Monogame,好吧,我把我一直在做的一个游戏移植到Monogame上,但是现在我有一个着色器问题,因为它被移植了。这是一个奇怪的错误,因为它在我的旧XNA项目上有效,而且在我第一次在新的monogame项目中使用它时也有效,但在那之后,除非我重新启动游戏 着色器是一个非常简单的着色器,用于查看灰度图像,并基于灰度从查找纹理中拾取颜色。基本上,我用它来随机化一个敌人的精灵图像,每当一个新的敌人出现在屏幕上。它在第一次繁殖敌人时起作用,但在那之后就不起作用了,只是提供了一个完全透明的纹理(不是空纹理) 另外,我现

好吧,我把我一直在做的一个游戏移植到Monogame上,但是现在我有一个着色器问题,因为它被移植了。这是一个奇怪的错误,因为它在我的旧XNA项目上有效,而且在我第一次在新的monogame项目中使用它时也有效,但在那之后,除非我重新启动游戏

着色器是一个非常简单的着色器,用于查看灰度图像,并基于灰度从查找纹理中拾取颜色。基本上,我用它来随机化一个敌人的精灵图像,每当一个新的敌人出现在屏幕上。它在第一次繁殖敌人时起作用,但在那之后就不起作用了,只是提供了一个完全透明的纹理(不是空纹理)

另外,我现在只针对Windows桌面,但我计划在某个时候针对Mac和Linux

以下是着色器代码本身

sampler input : register(s0);
Texture2D colorTable;
float seed; //calculate in program, pass to shader (between 0 and 1)

sampler colorTableSampler = 
sampler_state
{
    Texture = <colorTable>;
};

float4 PixelShaderFunction(float2 c: TEXCOORD0) : COLOR0
{
    //get current pixel of the texture (greyscale)
    float4 color = tex2D(input, c);
    //set the values to compare to.
    float hair = 139/255; float hairless = 140/255;
    float shirt = 181/255; float shirtless = 182/255;
    //var to hold new color
    float4 swap;
    //pixel coordinate for lookup
    float2 i;
    i.y = 1;

    //compare and swap
    if (color.r >= hair && color.r <= hairless)
    {
        i.x = ((0.5 + seed + 96)/128);
        swap = tex2D(colorTableSampler,i);
    }
    if (color.r >= shirt && color.r <= shirtless)
    {
        i.x = ((0.5 + seed + 64)/128);
        swap = tex2D(colorTableSampler,i);
    }
    if (color.r == 1)
    {
        i.x = ((0.5 + seed + 32)/128);
        swap = tex2D(colorTableSampler,i);
    }
    if (color.r == 0)
    {
        i.x = ((0.5 + seed)/128);
        swap = tex2D(colorTableSampler, i);
    }

    return swap;
}

technique ColorSwap
{
    pass Pass1
    {
        // TODO: set renderstates here.

        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}

如果有人有办法解决这个问题,我将非常感谢,如果您需要关于这个问题的其他信息,请告诉我。

我不确定当您转义反斜杠时,为什么在字符串前面有“at”(@)符号-除非您想在字符串中有\\,但在文件路径中它看起来很奇怪

您已经在代码中编写了:

BinaryReader Reader = new BinaryReader(File.Open(@"Content\\shaders\\test.mgfx", FileMode.Open));
除非您想\\在字符串中执行

BinaryReader Reader = new BinaryReader(File.Open(@"Content\shaders\test.mgfx", FileMode.Open));


但是不要两者都用。

我没有看到任何非常明显的东西,只是通读一遍,但实际上,如果有人仅仅看一下您的代码就想出来,这可能会很棘手

我建议做一个图形配置文件(通过VisualStudio)并捕获正确渲染的帧,然后错误渲染帧,并比较两者的状态


例如,输入纹理是否与您期望的一样,像素是否输出但被剔除,渲染目标上的输出是否正确(在这种情况下,问题可能是Get/SetData),等等。

将ps_2_0更改为ps_4_0_level_9_3

Monogame不能使用在HLSL 2上构建的着色器

此外,内置sprite批处理着色器使用ps_4_0_level_9_3和vs_4_0_level_9_3,如果尝试使用不同级别的着色器替换着色器的像素部分,则会遇到问题


这是我能看到的关于您的代码的唯一问题。

是的,您说得对,我不应该同时做这两件事。我没听清楚。虽然我仍然有同样的问题-适用于第一个纹理,之后透明。
BinaryReader Reader = new BinaryReader(File.Open(@"Content\\shaders\\test.mgfx", FileMode.Open));
BinaryReader Reader = new BinaryReader(File.Open(@"Content\shaders\test.mgfx", FileMode.Open));
BinaryReader Reader = new BinaryReader(File.Open("Content\\shaders\\test.mgfx", FileMode.Open));