2011-10-01 10 views
11

मैं हाल ही में एचएलएसएल प्रोग्रामिंग में शामिल हो रहा हूं और मैं बहुत उत्सुक हूं कि कुछ चीजें मैं वास्तव में कैसे कर रहा हूं।कुछ सरल एक्सएनए/एचएलएसएल प्रश्न

उदाहरण के लिए, मुझे यह बहुत ही सरल शेडर मिला है जो किसी भी तिल रंगीन पिक्सेल को लाल-आश रंग में रंग देता है।

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 विधानसभा में एक रजिस्ट्री है कि वर्तमान में इस्तेमाल किया पिक्सेल रंग को धारण करता है सकते हैं जीपीयू में (यह पूरी तरह से गलत हो सकता है, मैं बस यह सोच रहा हूं कि मुझे क्या लगता है)

और यदि ऐसा है, तो क्या इसका मतलब यह है कि float2 texCoords : TEXCOORD0 जैसे कुछ निर्दिष्ट करना, डिफ़ॉल्ट स्थिति को जीपीयू संसाधित कर रहा है?

उत्तर

7

mySampler नमूना रजिस्टर पर गठबंधन है, पहला एस 0 है।

स्प्राइटबैच एक ही रजिस्टर का उपयोग बनावट बनाने के लिए करता है ताकि आप इसे सुनिश्चित करने से पहले इसे निष्क्रिय कर सकें।

यह रजिस्टर ग्राफ़िकडिवाइस के साथ संबंध में है। Textures और GraphicDevice.SamplerStates arrays।

वास्तव में, अपने शेडर में आप इस वाक्य का उपयोग कर सकते हैं:

sampler TextureSampler : register(s0); 

संपादित करें:

आप इस कर सकते हैं आप अपने शेडर में एक दूसरे बनावट का उपयोग करने की आवश्यकता है:

HLSL 
     sampler MaskTexture : register(s1); 

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

रंग 0 एक रजिस्ट्री नहीं है और वर्तमान पिक्सेल रंग नहीं रखता है। यह आपके द्वारा उपयोग की जा रही वर्टेक्स संरचना को संदर्भित किया जाता है।

जब आप वर्टेक्सपॉशनकॉलर जैसे वर्टेक्स को परिभाषित करते हैं, तो कशेरुक में एक स्थिति और रंग होता है, लेकिन यदि आप दो रंगों के साथ एक कस्टम वर्टेक्स को परिभाषित करना चाहते हैं, तो आपको दो रंगों के बीच भेदभाव करने का एक तरीका चाहिए ... चैनल।

संख्या प्रत्यय का अर्थ उस चैनल का है जिसका आप वर्तमान चरम में संदर्भ दे रहे हैं।

+0

हालांकि रजिस्टर में नमूने को वास्तव में निर्दिष्ट किया गया है, हालांकि? मैंने यह निर्दिष्ट नहीं किया है कि यह किस रजिस्टर से नमूना पकड़ता है, इसलिए मुझे लगता है कि यह बिना किसी कोड विनिर्देश के डिफ़ॉल्ट रूप से s0 को पकड़ लेगा? इसके अलावा, आप एक और सवाल उठाते हैं: 'नमूना' काम 'sampler2D' जैसा ही होगा? – inline

+0

जो भी ड्रा ऑपरेशन आप करते हैं, उस रजिस्टरों का उपयोग करें, यदि आप स्प्राइटबैच का उपयोग कर रहे हैं या उस बनावट से पहले मूल प्रभाव डाल रहे हैं, तो यह आंतरिक रूप से किया जा रहा है ... – Blau

+0

मीठे। मेरे लिए कुछ चीजों को साफ़ करने के लिए धन्यवाद। :) – inline

संबंधित मुद्दे