0

所以我的教授给了我们班级的代码来帮助我们学习 Vector3D 绘图、定位和运动。代码最初是用 XNA 3.1 编写的,我们学校的实验室仍然使用 XNA 3.1,但是,我在笔记本电脑上做所有事情。我的笔记本电脑有 Visual Studio 2012(我有 2013 但还没有移动 XNA)。我已经找出并修复了除一个错误之外的所有错误。每当我调试和运行游戏时,我都会收到此错误:

Error 1 Errors compiling C:\Users\Nicholas\Documents\Visual Studio 2013\Projects\MGH05_PrimitiveObjects\MGH05_PrimitiveObjects\Content\Shaders\PositionColor.fx:
C:\Users\Nicholas\Documents\Visual Studio  2013\Projects\MGH05_PrimitiveObjects\MGH05_PrimitiveObjects\Content\Shaders\PositionColor.fx(27,6): error X3000: syntax error: unexpected token 'VertexShader'   C:\Users\Nicholas\Documents\Visual Studio 2013\Projects\MGH05_PrimitiveObjects\MGH05_PrimitiveObjects\Content\Content\Shaders\PositionColor.fx  27  6   MGH05_Win_PrimitiveObjects

我的教授没有帮助,谷歌也没有。有人知道如何解决这个问题吗?这是着色器(PositionColor.fx)代码:

float4x4 wvpMatrix  : WORLDVIEWPROJ;

struct VSinput
{
    float4 position : POSITION0;
    float4 color    : COLOR0;
};

struct VStoPS
{
    float4 position : POSITION0;
    float4 color    : COLOR0;
};

struct PSoutput
{
    float4 color    : COLOR0;
};

// alter vertex inputs
void VertexShader(in VSinput IN, out VStoPS OUT)
{
    // transform vertex
    OUT.position = mul(IN.position, wvpMatrix);
    OUT.color = IN.color;
}

// alter vs color output
void PixelShader(in VStoPS IN, out PSoutput OUT)
{
    float4 color = IN.color;
    OUT.color    = clamp(color, 0, 1); // range between 0 and 1
}

// the shader starts here
technique BasicShader
{
    pass p0
    { 
            // declare & initialize ps & vs
            vertexshader = compile vs_1_1 VertexShader();
            pixelshader  = compile ps_1_1 PixelShader();
    }
}

当我重命名 VertexShader 时,我仍然收到错误,但现在使用 PixelShader。当我重命名它们时,它仍然给我 VertexShader 错误。

如果有人有任何想法,请告诉我!另外,如果在错误的堆栈网站上提出此问题,我深表歉意。我认为这将是合适的地方。如果您需要任何额外信息,请告诉我!

提前致谢!

4

1 回答 1

0

正如 Romoku 所建议的那样,XNA 4 似乎使用了更新/不同的着色器版本,其中添加了一些新的关键字。这包括PixelShaderand VertexShader,因此它们可能不再用作标识符。

解决方案是给他们一些其他的名字(任何都可以)。还要记住更新技术中的名称。

void FancyVertexShader(in VSinput IN, out VStoPS OUT)
{
    // transform vertex
    OUT.position = mul(IN.position, wvpMatrix);
    OUT.color = IN.color;
}

// alter vs color output
void AwesomePixelShader(in VStoPS IN, out PSoutput OUT)
{
    float4 color = IN.color;
    OUT.color    = clamp(color, 0, 1); // range between 0 and 1
}

// the shader starts here
technique BasicShader
{
    pass p0
    { 
            // declare & initialize ps & vs
            vertexshader = compile vs_2_0 FancyVertexShader();
            pixelshader  = compile ps_2_0 AwesomePixelShader();
    }
}

编辑:正如您自己指出的那样,XNA 4 对顶点和像素着色器都使用 2.0 版。

于 2013-11-02T11:25:03.910 回答