2011-02-16 8 views
8

के साथ उपयोग के लिए स्मृति में एक प्रीकंपिल्ड एचएलएसएल शेडर लोड करना मुझे CreatePixelShader के साथ उपयोग करने के लिए मेमोरी में एक संकलित पिक्सेल शेडर लोड करने की आवश्यकता है, लेकिन मैं किसी भी D3DX कॉल का उपयोग नहीं कर सकता।CreatePixelShader

मैं यह कैसे कर सकता हूं?

fxc filename.hlsl /E PixelShaderEntry /Fo precompiledShader.ext 

लोड नियमित उपयोग करते हुए precompiled शेडर डेटा:

+0

आप डी 3 डीएक्स का उपयोग क्यों नहीं कर सकते? क्या आप डायरेक्टएक्स का बिल्कुल उपयोग नहीं कर रहे हैं, या यह किसी प्रकार का परीक्षण है? – thecoshman

उत्तर

4

FXC का उपयोग कर कमांड लाइन से आपके precompiled शेडर का निर्माण (मैं अपने संकलक और सी ++ भाषा के रूप में के रूप में दृश्य स्टूडियो 2010 का उपयोग कर रहा) सी ++ फ़ाइल लोडिंग कोड।

छद्म-ish कोड में

:

byte * data = loadFile("precompiledShader.ext"); 
IDirect3DPixelShader9 *ps = NULL; 
HRESULT hr = device->CreatePixelShader(data, ps); 
19

मुझे पता है किसी को छद्म कोड पहले पोस्ट की। यहां विंडोज एसडीके का उपयोग कर सी ++ कोड है (और अनुरोध के रूप में डी 3 डीएक्स पुस्तकालयों नहीं)।

यहां "पिक्सेलशैडर.cso" प्रोजेक्ट में एक .hlsl फ़ाइल से विजुअल स्टूडियो 11 द्वारा उत्पन्न प्रीकंपिल्ड एचएलएसएल शेडर है। संकलित .cso फ़ाइल आमतौर पर प्रोजेक्ट/प्रोजेक्टनाम/डीबग फ़ोल्डर में डिफ़ॉल्ट रूप से ले जाया जाता है। नतीजतन इसे उपयोग करने से पहले अपने स्रोत कोड के रूप में उसी निर्देशिका में कट और पेस्ट किया जाना चाहिए। आपको लगता है कि दृश्य स्टूडियो 11 के अंदर और आउटपुट सेटिंग्स को संपादित करते समय एचएलएसएल फ़ाइल पर राइट-क्लिक करके यह सेटिंग बदला जा सकता है। डिफ़ॉल्ट रूप से इसकी: $ (निर्देशिका)% (फ़ाइल का नाम) .cso एल की

ID3D11PixelShader* PS; 
ID3DBlob* PS_Buffer; 

D3DReadFileToBlob(L"PixelShader.cso", &PS_Buffer); 
d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS); 
d3d11DevCon->PSSetShader(PS, 0, 0); 

ध्यान में रखना "PixelShader.cso" से पहले: $ (OutDir)% (फ़ाइल का नाम) .cso, यह करने के लिए बदल जाते हैं। मेरा प्रोजेक्ट मल्टी-बाइट कैरेक्टर सेट का उपयोग कर रहा था, अगर आपके पास यूनिकोड एल पर सेट है तो आवश्यक नहीं हो सकता है।