2011-10-01 13 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でも任意のデータを持っているかであることを理解しています。私はそれを設定したり、テクスチャをまったく渡したりしていませんが、それは魔法のように私のテクスチャのデータを含んでいます。

また、のようなものとの違いは何ですか: COLORCOLOR0 または TEXCOORDTEXCOORD0

私は論理的な推測を取り、COLOR0は、現在使用されるピクセルの色を保持しているアセンブリ内のレジストリがあると言うことができますGPUで

もしそうなら、float2 texCoords : TEXCOORD0のようなものを指定することは、GPUが処理している現在の位置をデフォルトで取得することを意味するのでしょうか?

答えて

7

mySamplerはサンプルレジスタにアサインされ、最初はS0です。

SpriteBatchは同じレジスタを使用してテクスチャを描画します。その前に確実に初期化しています。

このレジスタは、GraphicDevice.TexturesおよびGraphicDevice.SamplerStates配列と関連しています。

実際には、あなたがこの文を使用することができ、あなたのシェーダで:

sampler TextureSampler : register(s0); 

EDIT:あなたのシェーダで第二のテクスチャを使用する必要がある場合

あなたはこれを行うことができます。

HLSL 
     sampler MaskTexture : register(s1); 

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

Color0はレジストリではなく、現在のピクセルカラーを保持しません。これは、使用している頂点構造を参照しています。

VertexPositionColorのような頂点を定義する場合、頂点には位置と色が含まれますが、2つの色でカスタム頂点を定義する場合は、2つの色を区別する方法が必要です。チャネル。

数字の接尾辞は、現在の頂点で参照しているチャンネルを意味します。

+0

正確には、それはレジスタのサンプルに割り当てられますか?私はサンプルを取得するレジスタを指定していないので、デフォルトでコード指定なしでs0を取得すると思いますか? さらに、 'sampler'は' sampler2D'と同じように動作するのでしょうか? – inline

+0

スプライトバッチや基本的なエフェクトを使用している場合は、そのテクスチャを使用していれば、そのレジスタを使用してください。 – Blau

+0

Sweet。私のためにいくつかのものをクリアしていただきありがとうございます。 :) – inline