3

我被要求将以下问题拆分为多个问题:

HLSL 和 Pix 问题数

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

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

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

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

4

2 回答 2

7

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

那么,解决方案是自己也指定一个顶点着色器。幸运的是,Microsoft 提供了XNA 内置着色器的源代码。它所涉及的只是矩阵变换。这是代码,已修改,因此您可以直接使用它:

float4x4 MatrixTransform;

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

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

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);
于 2013-02-09T04:36:54.383 回答
-2

您可以尝试这里的简单示例。灰度着色器是了解最小像素着色器如何工作的一个很好的例子。

基本上,您在内容项目下创建一个效果,如下所示:

sampler s0;

float4 PixelShaderFunction(float2 coords: TEXCOORD0) : COLOR0
{
    // B/N
    //float4 color = tex2D(s0, coords);
    //color.gb = color.r;

    // Transparent
    float4 color = tex2D(s0, coords);
    return color;
}

technique Technique1
{
    pass Pass1
    {
        PixelShader = compile ps_2_0 PixelShaderFunction();
    }
}

您还需要:

  1. 创建一个 Effect 对象并加载其内容。

    ambienceEffect = Content.Load("效果/环境");

  2. 调用您的 SpriteBatch.Begin() 方法传递您要使用的效果对象

    spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, null, null, null, ambienceEffect, camera2d.GetTransformation());

  3. 在 SpriteBatch.Begin() - SpriteBatch.End() 块内,您必须在效果内调用技术

    ambienceEffect.CurrentTechnique.Passes[0].Apply();

于 2013-07-06T09:45:58.410 回答