2012-07-26 12 views
5

शेडर करने के लिए कई बनावट भेज रहा शेडर करने के लिए एक बनावट भेज सकते हैं:DirectX 11, इस कोड का उपयोग

devcon->PSSetShaderResources(0, 1, &pTexture); 
बेशक

मैं द्वारा pTexture बनाया: D3DX11CreateShaderResourceViewFromFile

shader: Texture2D बनावट;

return color * Texture.Sample(ss, texcoord); 

मैं वर्तमान में केवल शेडर करने के लिए एक बनावट भेज रहा है, लेकिन मैं कई बनावट भेजना चाहते हैं, यह कैसे संभव है?

धन्यवाद।

+0

क्या आप मिश्रण/बहु-पाठ करने की कोशिश कर रहे हैं? –

उत्तर

7

Texture Arrays का उपयोग करके। जब आप अपना D3D11_TEXTURE2D_DESC भरते हैं तो ArraySize सदस्य देखें। यह desc संरचना वह है जो ID3D11Device::CreateTexture2D पर जाती है। फिर अपने शेडर में आप एक तीसरे टेक्सकोर्ड नमूना सूचकांक का उपयोग करते हैं जो इंगित करता है कि उस सरणी में कौन सा 2 डी बनावट है जिसका आप उल्लेख कर रहे हैं।

अद्यतन: मैं सिर्फ महसूस किया आप इसे ऊपर, (अर्थात विभिन्न भू के लिए) एकाधिक कॉल कर इस स्थिति में आप शेडर की बनावट संसाधन दृश्य को अपडेट के बारे में बात हो सकती है। यदि आप प्रभाव ढांचे का उपयोग कर रहे हैं तो आप ID3DX11EffectShaderResourceVariable::SetResource का उपयोग कर सकते हैं, या वैकल्पिक रूप से PSSetShaderResources का उपयोग कर एक नए बनावट को पुनर्निर्मित कर सकते हैं। हालांकि, यदि आप एकाधिक बनावट के बीच मिश्रण करने की कोशिश कर रहे हैं, तो आपको बनावट सरणी का उपयोग करना चाहिए।

आप 3 डी बनावट भी देखना चाहते हैं, जो सरणी में आसन्न बनावट के बीच अंतरण करने का एक प्राकृतिक तरीका प्रदान करता है (जबकि 2 डी सरणी स्वचालित रूप से निकटतम पूर्णांक पर क्लैंप की जाती है) टेक्स्टकोर्ड में तीसरे तत्व के माध्यम से। एचएलएसएल sampleremarks देखें।

+0

दिलचस्प, बीमार कोशिश करें ... –

+0

सिर्फ एक सवाल है, अगर मैं विलय करना चाहता हूं तो मैं कैसे चुना जा सकता हूं, इसलिए मैं केवल कुछ परिस्थितियों में विलय करना चाहता हूं? मैं दूसरे टेक्सकोर्ड को अक्षम करता हूं? –

+0

मैं प्रभाव ढांचे का उपयोग नहीं करता हूं। –

14

आप कई बनावट का उपयोग तब तक कर सकते हैं जब तक उनकी गिनती आपके शेडर प्रोफ़ाइल चश्मे से अधिक न हो। यहाँ एक उदाहरण है: HLSL कोड:

Texture2D diffuseTexture : register(t0); 
Texture2D anotherTexture : register(t1); 

सी ++ कोड:

devcon->V[P|D|G|C|H]SSetShaderResources(texture_index, 1, &texture); 

तो ऊपर HLSL कोड के लिए उदाहरण के लिए यह हो जाएगा:

devcon->PSSetShaderResources(0, 1, &diffuseTextureSRV); 
devcon->PSSetShaderResources(1, 1, &anotherTextureSRV); (SRV stands for Shader Texture View) 

या:

ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV}; 
devcon->PSSetShaderResources(0, 2, &textures); 

एचएलएसएल नाम arbi हो सकता है trary और किसी भी विशिष्ट नाम से मेल नहीं खाता है - केवल सूचकांक पदार्थ। जबकि "रजिस्टर (tXX);" कथन की आवश्यकता नहीं है, मैं आपको भ्रम से बचने के लिए उनका उपयोग करने की सलाह दूंगा क्योंकि किस बनावट से स्लॉट के अनुरूप है।

+0

* (एसआरवी शेडर संसाधन दृश्य के लिए खड़ा है) – d7samurai