HLSL 3可以一个像素着色器可以单独申报?(HLSL 3 Can a Pixel Shader b

2019-07-19 15:09发布

我一直在问到下面分裂的问题分成多个问题:

问题HLSL和PIX号

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

着色器将编译很好,我会然后调用SpriteBatch绘制时从Visual Studio但得到这个错误()。

“不能在早期着色模式的混合Shader Model 3.0的。如果两个顶点着色器和像素着色器编译为3.0,它们必须是。”

我不相信我在着色器中定义的任何较早使用任何东西,然后3.所以我留下了有点混乱。 任何帮助,将不胜感激。

Answer 1:

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

该解决方案的话,同时指定一个顶点着色器自己。 好在微软提供了源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);


Answer 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. 创建效果对象,并加载其内容。

    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]。适用();



文章来源: HLSL 3 Can a Pixel Shader be declared alone?
标签: xna shader hlsl