2012-04-15 10 views
11

में 2.0 मेरा मुख्य सवाल के साथ शुरू करने के लिए>:पिक्सेल Shader मॉडल FireMonkey

मैं अपने FireMonkey अनुप्रयोगों में पिक्सेल शेडर मॉडल 3, 4 या 5 का उपयोग कर सकते हैं?

मैं अपने फ़ायरमॉन्की प्रोग्राम में गतिशील रूप से पिक्सेल शेडर्स बनाने में सक्षम होना चाहता हूं। ऐसा करने के लिए, अब मैं fxc.exe का उपयोग कर एक पिक्सेल शेडर संकलित करता हूं जो डायरेक्टएक्स एसडीके के साथ आता है, और संकलित कोड को मेरे TShaderFilter वंशज में लोड करता है। यह ठीक काम करता है (अगर आपको दिलचस्पी है कि मैं ऐसा कैसे करता हूं तो मुझे बताएं)।

हालांकि, अगर मैं लक्ष्य प्रोफ़ाइल के रूप में ps_2_0 के साथ संकलित करता हूं तो मैं केवल काम करने के लिए चीजें प्राप्त कर सकता हूं।

मैं वर्तमान में शेडर मॉडल 2.0 की सीमाओं में चल रहा हूं। उदाहरण के लिए लूप को कंपाइलर द्वारा अनलॉक किया जाता प्रतीत होता है, और स्तर 2 शेडर्स में आपके पास अधिकतम संख्या में निर्देश हो सकते हैं। इसके कारण, संभावनाओं की संख्या बहुत सीमित है।


उदाहरण: नीचे शेडर कोड एक मैंडलब्रॉट भग्न पैदा करता है। अगर मैं Iterations बहुत अधिक सेट करता हूं, तो यह संकलित नहीं होता है। त्रुटि संदेश:

error X5608: Compiled shader code uses too many arithmetic instruction slots (78). Max. allowed by the target (ps_2_0) is 64.

#define Iterations 12 

float2 Pan; 
float Zoom; 
float Aspect; 
float4 main(float2 texCoord : TEXCOORD0) : COLOR0 
{ 
    float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan; 
    float2 v = 0;   
    for (int n = 0; n < Iterations; n++) 
    { 
     v = float2(v.x * v.x - v.y * v.y, v.x * v.y * 2) + c; 
    }   
    return (dot(v, v) > 1) ? 1 : 0; 
} 
शेडर मॉडल ps_3_0 मैं और अधिक पुनरावृत्तियों के साथ संकलन कर सकते हैं, लेकिन संकलित शेडर साथ

FireMonkey में काम करने के लिए प्रतीत नहीं होता। मुझे कोई त्रुटि संदेश नहीं मिला है; परिणामस्वरूप मुझे बस एक लाल छवि मिलती है।


यहाँ किसी को भी यह कैसे चारों ओर पाने के लिए पर कोई विचार है करता है, या FireMonkey बस मेरी ग्राफिक्स कार्ड की पूरी क्षमता का उपयोग करने में सक्षम नहीं है?

नोट, मैंने देखा है कि फायरमोन्की के लिए न्यूनतम आवश्यकता शेडर स्तर 2.0 के साथ एक ग्राफिक्स कार्ड है, लेकिन यह स्पष्ट नहीं है कि इसका मतलब है कि आप शेडर स्तर 3 या उच्चतर का उपयोग नहीं कर सकते हैं।

+3

+1, दिलचस्प सवाल! मुझे यह पढ़ने में दिलचस्पी होगी कि आप कैसे संकलन कर रहे हैं और शेडर्स का उपयोग भी कर रहे हैं। –

उत्तर

3

इस उत्तर लेखन के समय सही है, लेकिन के रूप में FireMonkey विकसित संभवतः बदल जाएगा:

आप PixelShader उपयोग नहीं कर सकते या ShaderModel 3.0 या उच्चतर, FireMonkey (विंडोज के अंतर्गत) DirectX 9 का उपयोग करता है के रूप में, जबकि पिक्सेलशैडर/शेडरमोडेल 3.0+ डायरेक्टएक्स 10 की विशेषताएं हैं। यदि आप Winapi.D3DX9.pas (लाइन 2871-2872) में देखते हैं, तो आप ps_3_0 की पुष्टि करने में सक्षम होंगे, जबकि Winapi.D3DX10.pas (लाइन 3224-3230) यह समर्थित है।

तो, एकमात्र तरीका है कि आप पिक्सेलशैडर/शेडरमोडेल 3.0+ का उपयोग करने में सक्षम होंगे, या तो डायरेक्टएक्स 10 संदर्भ का उपयोग करने के लिए फ़ायरमॉन्की को संशोधित करना होगा, या अनुरोध (दूसरों के समर्थन के साथ) कि एम्बरकेडरो आपके लिए इसे बदल देगा ।

+1

मुझे लगता है कि यह गलत है। डायरेक्टएक्स 9.0 सी (2004 से) शेडर मॉडल 3.0 का समर्थन करता है। एसएम 2 मूल डायरेक्टएक्स 9.0 रिलीज के साथ आया था, लेकिन 9.0 सी आठ साल पुराना है और यह बहुत मानक है। डायरेक्टएक्स 10 ने एसएम 4 पेश किया। मैंने पास्कल अनुवादों की जांच नहीं की है, और इसलिए शायद वे एक वैध टोकन खो रहे हैं, लेकिन इसका मतलब है कि यदि एफएमएक्स डायरेक्टएक्स 9 का उपयोग करता है तो यह निश्चित रूप से एसएम 3 का उपयोग करने में सक्षम होना चाहिए। –

+0

आप सही हो सकते हैं। मैं निश्चित रूप से क्या कह सकता हूं कि डीएक्स 9 के लिए डेल्फी का अनुवाद * नहीं * ps_3_0 ध्वज प्रदान करता है। मुझे पूरी तरह से यकीन नहीं है कि डायरेक्टएक्स 9.0 सी ने एसएम 3.0 और पीएस 3.0 जोड़ा है, लेकिन डेल्फी के हेडर निश्चित रूप से नहीं करते हैं। – LaKraven

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