gpt4 book ai didi

xna - HLSL 3 像素着色器可以单独声明吗?

转载 作者:行者123 更新时间:2023-12-04 19:56:49 27 4
gpt4 key购买 nike

我被要求将下面的问题分成多个问题:

HLSL and Pix number of questions

这是在问第一个问题,我可以在 HLSL 3 中运行没有顶点着色器的像素着色器吗?在 HLSL 2 中,我注意到你可以,但我似乎无法在 3 中找到方法?

着色器可以正常编译,但是我会在调用 SpriteBatch Draw() 时从 Visual Studio 收到此错误。

“不能将着色器模型 3.0 与早期着色器模型混合使用。如果顶点着色器或像素着色器编译为 3.0,则它们必须都是。”

我不相信我在着色器中定义了任何东西来使用 3 之前的任何东西。所以我有点困惑。任何帮助将不胜感激。

最佳答案

问题是内置的SpriteBatch 着色器是2.0。如果您仅指定像素着色器,SpriteBatch 仍会使用其内置的顶点着色器。因此版本不匹配。

然后,解决方案是自己也指定一个顶点着色器。幸运的是微软提供了 source to XNA's built-in shaders .它所涉及的只是一个矩阵变换。这是经过修改的代码,您可以直接使用它:

float4x4 MatrixTransform;

void SpriteVertexShader(inout float4 color : COLOR0,
inout float2 texCoord : TEXCOORD0,
inout float4 position : SV_Position)
{
position = mul(position, MatrixTransform);
}

然后 - 因为 SpriteBatch 不会为您设置它 - 正确设置效果的 MatrixTransform。这是“客户”空间的简单投影(来自 this blog post )。这是代码:

Matrix projection = Matrix.CreateOrthographicOffCenter(0, 
GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, 0, 0, 1);
Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);
effect.Parameters["MatrixTransform"].SetValue(halfPixelOffset * projection);

关于xna - HLSL 3 像素着色器可以单独声明吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14773640/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com