C# 一些简单的XNA/HLSL问题
我最近开始接触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
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或基本效果,它本质上已经完成了。。。