2011-10-01 41 views
11

我最近一直在進入HLSL編程,我很好奇我的一些工作實際上是如何工作的。例如,這裏有一個非常簡單的着色器,可以將任何深青色的像素着色爲紅色。一些簡單的XNA/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甚至有任何數據。我沒有設置或傳入紋理,但它神奇地包含了我的紋理數據。

而且,是什麼樣的事物之間的區別: COLORCOLOR0TEXCOORDTEXCOORD0

我可以把一個邏輯的猜測,說COLOR0是組裝註冊表保存當前使用的像素顏色在GPU中。 (這可能是完全錯誤的,我只是說明了我的想法)

如果是這樣,那麼這是否意味着指定類似float2 texCoords : TEXCOORD0的內容默認情況下會抓取GPU正在處理的當前位置?

回答

7

mySampler被標記爲樣本寄存器,第一個是S0。

SpriteBatch使用相同的寄存器來繪製紋理,因此您之前已經初始化它。

該寄存器與GraphicDevice.Textures和GraphicDevice.SamplerStates數組有關。

事實上,在你的着色器,你可以用這樣一句話:

sampler TextureSampler : register(s0); 

編輯:

,如果您需要在着色器使用第二個紋理可以讓這個:

HLSL 
     sampler MaskTexture : register(s1); 

C#: 
     GraphicsDevice.Textures[1] = MyMaskTexture; 
     GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode.... 

Color0不是註冊表,並且不包含當前像素顏色。它是指您正在使用的頂點結構。

當你像VertexPositionColor一樣定義一個頂點時,頂點包含一個Position和一個Color,但是如果你想用兩種顏色定義一個自定義頂點,你需要一種方法來區分兩種顏色......通道。

數字後綴表示您在當前頂點引用的通道。

+0

儘管它在哪裏被分配到寄存器中的樣本?我沒有指定它從哪個寄存器抓取樣本,所以我想它會在沒有任何代碼規範的情況下默認抓取s0? 另外,您還提出了另一個問題:'sampler'的工作方式與'sampler2D'相同嗎? – inline

+0

無論你做什麼繪製操作,使用那個寄存器,如果你在使用spritebatch或基本效果之前使用那個紋理,它本質上是做的... – Blau

+0

甜。感謝您爲我清理一些東西。 :) – inline