我最近一直在進入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
甚至有任何數據。我沒有設置或傳入紋理,但它神奇地包含了我的紋理數據。
而且,是什麼樣的事物之間的區別: COLOR
和COLOR0
或 TEXCOORD
和TEXCOORD0
我可以把一個邏輯的猜測,說COLOR0
是組裝註冊表保存當前使用的像素顏色在GPU中。 (這可能是完全錯誤的,我只是說明了我的想法)
如果是這樣,那麼這是否意味着指定類似float2 texCoords : TEXCOORD0
的內容默認情況下會抓取GPU正在處理的當前位置?
儘管它在哪裏被分配到寄存器中的樣本?我沒有指定它從哪個寄存器抓取樣本,所以我想它會在沒有任何代碼規範的情況下默認抓取s0? 另外,您還提出了另一個問題:'sampler'的工作方式與'sampler2D'相同嗎? – inline
無論你做什麼繪製操作,使用那個寄存器,如果你在使用spritebatch或基本效果之前使用那個紋理,它本質上是做的... – Blau
甜。感謝您爲我清理一些東西。 :) – inline