2009-08-17 9 views
14

ठीक है, मेरे जीएलएसएल खंडक शेडर में मैं अंतरिक्ष में किसी विशेष रेखा से खंड की दूरी की गणना करने में सक्षम होना चाहता हूं।glsl में gl_FragCoord की गणना कैसे करें

varying vec2 fake_frag_coord; 
//in vertex shader: 
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy; 

अब टुकड़ा शेडर में मैं उम्मीद:

इसी का परिणाम है कि मैं पहली बार दर्पण gl_FragCoord में क्या समाप्त होता है मेरी शीर्ष शेडर में घटती-बढ़ती vec2 सेट का उपयोग करने के लिए कोशिश कर रहा हूँ है

gl_FragCoord.xy==fake_frag_coord 

लेकिन ऐसा नहीं है। पाइपलाइन gl_Position पर gl_FragCoord में बदलने के लिए क्या ऑपरेशन करता है कि मैं fake_frag_coord पर करने की उपेक्षा कर रहा हूं?

उत्तर

11

gl_FragCoord स्क्रीन निर्देशांक है, इसलिए आपको स्क्रीन के आकार के बारे में जानकारी और स्थिति के आधार पर इसे उत्पादित करने की आवश्यकता होगी। आपके द्वारा उत्पादित fake_frag_coord सामान्यीकृत डिवाइस निर्देशांक में स्क्रीन में एक बिंदु से मेल खाएगा जो मुझे लगता है (-1 से 1)। इसलिए यदि आप किसी विशेष आयाम में आधे स्क्रीन के आकार को गुणा करना चाहते हैं, और फिर उस आकार को जोड़ना चाहते हैं, तो आपको वास्तविक स्क्रीन पिक्सल मिलेंगे।

+1

मैं गलत होने के बारे में गलत था, लेकिन gl_ModelViewProjectionMatrix * gl_Vertex संभावित रूप से गणना त्रुटियों का उपयोग करने के बारे में सही था। – karx11erx

+2

नाइटपिक: जो वास्तव में आपको सामान्यीकृत डिवाइस निर्देशांक की बजाय क्लिप-स्पेस निर्देशांक देगा, क्योंकि आप परिप्रेक्ष्य विभाजन नहीं कर रहे हैं जो रास्टरराइज़ेशन प्रक्रिया (वर्टेक्स शेडर और खंड शेडर के बीच) के दौरान होता है। http://www.glprogramming.com/red/chapter03.html#name1 – Pike65

+0

@ Pike65 यह सिर्फ एक नाइटपिक नहीं है, इसका परिणाम परिप्रेक्ष्य प्रक्षेपण के लिए पूरी तरह अलग मूल्यों में होना चाहिए। –

0

आपके पास समस्या यह है कि gl_ModelViewProjectionMatrix * gl_Vertex एक शेडर में गणना की गई है जो निश्चित फ़ंक्शन पाइपलाइन उपज हमेशा नहीं होती है। समान परिणाम प्राप्त करने के लिए, fake_frag_coord = ftransform() करें।

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

और फिर इसे अपने स्क्रीन आयामों के साथ स्केल करें।

+0

ftransform स्थिति को उत्पन्न करता है, न कि fragcoord। प्रश्न यह नहीं पूछ रहा है कि स्थिति कैसे प्राप्त करें। –

+0

मेरा जवाब पूरी तरह गलत नहीं था। आपको अपने स्क्रीन आयामों के साथ fake_frag_coord स्केल करने की आवश्यकता है, लेकिन आप fake_frag_coord = gl_ModelViewProjectionMatrix * gl_Vertex या = ftransform() का उपयोग करने के आधार पर अलग-अलग परिणाम प्राप्त कर सकते हैं। – karx11erx

-2
varying vec2 fake_frag_coord; 
//in vertex shader: 

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy 
0

मेरी इच्छा है कि मेरे पास अधिक प्रतिनिधि था इसलिए मैं भी नाइटपिक कर सकता था। यहां मुझे क्या पता है। ओपनजीएल स्वचालित रूप से आपके लिए डिवाइड-बाय-डब्ल्यू निष्पादित करता है, इसलिए जब तक एक स्थिति एक टुकड़े शेडर में आती है, तब तक यह पहले से ही एनडीसी निर्देशांक में है, और तब तक डब्ल्यू 1.0 होगा, डब्ल्यू द्वारा विभाजित करने की एकमात्र समय है आप सीपीयू पक्ष पर एक ही गणित करना चाहते हैं, और एक ही परिणाम प्राप्त करें, या, यदि आप किसी अजीब कारण के लिए, अपने कशेरुक शेडर के भीतर एनडीसी निर्देशांक प्राप्त करना चाहते थे।

+1

'gl_FragCoord' ** ** एनडीसी में ** नहीं है। यह खिड़की निर्देशांक में है। –