2011-03-20 13 views
42

क्या वे चर जो आप मूल्यों को भर रहे हैं, यह निर्धारित करता है कि आप किस सटीक के साथ काम कर रहे हैं, बराबर चिह्न के दाईं ओर?ओपनजीएल ईएस 2.0/जीएलएसएल में, आपको सटीक विनिर्देशों की आवश्यकता कहां है?

gl_FragColor = lowp vec4(1); 

यहाँ है एक और उदाहरण:

उदाहरण के लिए, अर्थ का कोई फर्क, सटीक विनिर्देशक यहाँ करने के लिए, है

lowp float floaty = 1. * 2.; 
floaty = lowp 1. * lowp 2.; 

और अगर आप कुछ तैरता लेते हैं, और एक वेक्टर बनाने या उनसे मैट्रिक्स, क्या वेक्टर या मैट्रिक्स आपके द्वारा उत्पादित मूल्यों की सटीकता पर ले जाएगा, या वे मान किसी अन्य परिशुद्धता स्तर में बदल जाएंगे?

मैं अनुकूलन के इस सबसे अच्छा सवाल का जवाब होगा लगता है:,

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal) 

मेरा मतलब है, यहां तक ​​जाने की जरूरत है, तो आप इसे जितनी जल्दी संभव के रूप में चाहते हैं, या इसके बारे में कुछ बेकार है?

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal) 

मुझे पता है तुम नाव के लिए डिफ़ॉल्ट सटीक परिभाषित कर सकते हैं, और कहा कि यह माना जाता है कि वैक्टर और मैट्रिक्स के लिए बाद में प्रयोग किया जाता है। शिक्षा के उद्देश्य के लिए मान लें, कि हम इस पहले से परिभाषित किया था:

precision highp float; 

उत्तर

60
  1. आप जाएं, क्योंकि वे जो कुछ भी वे करने के लिए आवंटित किया जा रहा है के लिए मूल्यांकन समय संकलन मिल पर स्थिरांक/शाब्दिक परिशुद्धता विनिर्देशक जरूरत नहीं है। इसके अलावा, gl_FragColor की परिशुद्धता पहले से ही रेंडर लक्ष्य की गहराई के आधार पर परिभाषित की गई है, इसलिए आपके द्वारा निर्दिष्ट सटीकता से कोई फर्क नहीं पड़ता।

  2. शिखर shaders में, निम्न precisions डिफ़ॉल्ट रूप से घोषित किया गया है: (4.5.3 Default Precision Qualifiers)

    precision highp float; 
    precision highp int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    और टुकड़ा shaders में आपको मिलता है:

    precision mediump int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    इसका मतलब यह है कि आप में एक नाव यह घोषणा करते हैं एक टुकड़ा शेडर, आपको यह कहना है कि यह lowp या mediump है। डिफ़ॉल्ट float/int परिशुद्धता मैट्रिक्स/वैक्टर तक भी विस्तारित है।

  3. highp केवल प्रणाली है कि GL_FRAGMENT_PRECISION_HIGH मैक्रो 1 को परिभाषित पर समर्थित है; बाकी पर आपको एक कंपाइलर त्रुटि मिल जाएगी। (4.5.4 Available Precision Qualifiers)

  4. अभिव्यक्ति में परिशुद्धता के लिए नियम यह है कि वे स्वचालित रूप से असाइनमेंट/पैरामीटर के प्रकार पर आते हैं जो वे बाध्य हैं। तो आपके डॉट के लिए, यह डिफ़ॉल्ट रूप से इनपुट प्रकारों की सटीकता का उपयोग करेगा और अतिरिक्त lowp अनावश्यक (और वाक्यगत रूप से गलत) हैं। यदि आप एक प्रकार को कम परिशुद्धता में डाउन-कास्ट करना चाहते हैं, तो ऐसा करने का एकमात्र तरीका यह स्पष्ट रूप से कम परिशुद्धता को असाइन करना है।

ये जवाब Khronos GLSL कल्पना है, जो आप यहां पा सकते हैं (प्रासंगिक वर्गों 4.5.2 और 4.5 से सब कर रहे हैं।3): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

+5

"इसके अलावा, चूंकि gl_FragColor की परिशुद्धता पहले से ही प्रस्तुत करने की गहराई के आधार पर परिभाषित की गई है" इस कथन के लिए आपका स्रोत क्या है? मुझे इस बारे में कोई जानकारी नहीं है। – eodabash

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