【问题标题】:Some simple XNA/HLSL questions一些简单的 XNA/HLSL 问题
【发布时间】:2011-10-01 00:53:30
【问题描述】:

我最近开始接触 HLSL 编程,我很好奇我正在做的一些事情实际上是如何工作的。

例如,我在这里有一个非常简单的着色器,可以将任何青色像素着色为红色。

sampler2D mySampler;

float4 MyPixelShader(float2 texCoords : TEXCOORD0): COLOR
{
    float4 Color;
    Color = tex2D(mySampler, texCoords.xy);

    if(Color.r == 0 && Color.g == 1.0 && Color.b == 1.0)
    {
        Color.r = 1.0;
        Color.g = 0.5;
        Color.b = 0.5;
    }
    return Color;
}

technique Simple
{
    pass pass1
    {
        PixelShader = compile ps_2_0 MyPixelShader();
    }
}

我知道tex2D 函数在指定位置抓取像素的颜色,但我不明白mySampler 甚至有任何数据。我根本没有设置它或传入纹理,但它神奇地包含了我的纹理数据。

此外,以下内容之间有什么区别: COLORCOLOR0 或者 TEXCOORDTEXCOORD0

我可以进行一个合乎逻辑的猜测,并说COLOR0 是程序集中的一个注册表,它保存了 GPU 中当前使用的像素颜色。 (这可能是完全错误的,我只是陈述我的想法)

如果是这样,这是否意味着指定 float2 texCoords : TEXCOORD0 之类的内容会默认获取 GPU 正在处理的当前位置?

【问题讨论】:

    标签: c# xna shader hlsl


    【解决方案1】:

    mySampler 分配给一个样本寄存器,第一个是 S0。

    SpriteBatch 使用相同的寄存器来绘制纹理,因此您之前肯定已经对其进行了初始化。

    此寄存器与 GraphicDevice.Textures 和 GraphicDevice.SamplerStates 数组有关。

    其实在你的shader中你可以使用这句话:

     sampler TextureSampler : register(s0);
    

    编辑:

    如果您需要在着色器中使用第二个纹理,您可以这样做:

     HLSL
          sampler MaskTexture : register(s1);
    
     C#:
          GraphicsDevice.Textures[1] = MyMaskTexture;
          GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode....
    

    Color0 不是注册表,不保存当前像素颜色。它指的是您正在使用的顶点结构。

    当您定义像 VertexPositionColor 这样的顶点时,该顶点包含一个 Position 和一个 Color,但是如果您想定义具有两种颜色的自定义顶点,则需要一种方法来区分这两种颜色...通道.

    数字后缀表示当前顶点所指的通道。

    【讨论】:

    • 但是,它到底是在哪里分配给寄存器中的样本?我没有指定它从哪个寄存器中获取样本,所以我猜它会默认获取 s0 而没有任何代码规范?此外,您还提出了另一个问题:sampler 的工作方式与sampler2D 一样吗?
    • 无论你做什么绘制操作,使用那个寄存器,如果你之前使用的是 spritebatch 或基本效果,那么它本质上已经完成了......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多