Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一些简单的XNA/HLSL问题_C#_Xna_Shader_Hlsl - Fatal编程技术网

C# 一些简单的XNA/HLSL问题

C# 一些简单的XNA/HLSL问题,c#,xna,shader,hlsl,C#,Xna,Shader,Hlsl,我最近开始接触HLSL编程,我很好奇我正在做的一些事情实际上是如何工作的 例如,我这里有一个非常简单的着色器,它将任何青色像素着色为淡红色 sampler2D mySampler; float4 MyPixelShader(float2 texCoords : TEXCOORD0): COLOR { float4 Color; Color = tex2D(mySampler, texCoords.xy); if(Color.r == 0 && Colo

我最近开始接触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
怎么会有任何数据。我根本没有设置它或传入纹理,但它神奇地包含了我的纹理数据

此外,以下各项之间的区别是什么:
COLOR
COLOR0
TEXCOORD
TEXCOORD0

我可以从逻辑上猜测,
COLOR0
是汇编中的一个注册表,它保存GPU中当前使用的像素颜色。(这可能是完全错误的,我只是说说我的想法)


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

mySampler被关联到样本寄存器,第一个是S0

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

此寄存器与GraphicDevice.Textures和GraphicDevice.SamplerState数组相关

事实上,在着色器中,您可以使用以下语句:

 sampler TextureSampler : register(s0);
编辑:

如果需要在着色器中使用第二个纹理,可以执行以下操作:

 HLSL
      sampler MaskTexture : register(s1);

 C#:
      GraphicsDevice.Textures[1] = MyMaskTexture;
      GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode....
Color0不是注册表,不包含当前像素颜色。它指的是您正在使用的顶点结构

定义顶点(如VertexExpositionColor)时,顶点包含位置和颜色,但如果要使用两种颜色定义自定义顶点,则需要一种区分这两种颜色的方法。。。频道


数字后缀表示您在当前顶点中引用的通道。

但它在寄存器中的样本中的具体分配位置是什么?我还没有指定它从哪个寄存器获取样本,所以我猜默认情况下它只获取s0而不需要任何代码规范?此外,您还提出了另一个问题:
sampler
的工作原理是否与
sampler2D
的工作原理相同?无论您做什么绘制操作,都要使用该寄存器,如果您在使用该纹理之前使用的是spritebatch或基本效果,它本质上已经完成了。。。