2013-06-24 4 views
11

का उपयोग कर राउंड पॉइंट ड्राइंग मैं निश्चित पाइपलाइन का उपयोग कर how to draw round points जानता हूं। हालांकि मुझे आधुनिक ओपनजीएल का उपयोग करके ऐसा करने की ज़रूरत है। क्या यह संभव है, या मुझे प्वाइंट स्प्राइट्स और बनावट का उपयोग करना चाहिए?आधुनिक ओपनजीएल

interested.Here के लिए कि यह कैसे तय पाइप लाइन के साथ किया जाता है:

 glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_NOTEQUAL, 0); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_POINT_SMOOTH); 
    glPointSize(8.0); 

    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(myMatrix); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(myAnotherMatrix); 

    glBegin(GL_POINTS); 
    glColor3f(1,1,1); 

    glVertex3fv(position); 


    glEnd(); 
    glDisable(GL_POINT_SMOOTH); 
    glBlendFunc(GL_NONE, GL_NONE); 
    glDisable(GL_BLEND); 
+0

तुम कैसे,, फिक्स्ड पाइप लाइन का उपयोग कर यद्यपि नहीं तो दौर अंक आकर्षित किया बिंदु sprites और बनावट का उपयोग कर? क्या आप 'GL_POINT_SMOOTH' के साथ 'glPointSize' का उपयोग करते हैं? मुझे नहीं लगता कि यह कभी भी एक विश्वसनीय तरीका रहा है। –

+0

एक हैक है;) अद्यतन देखें। –

उत्तर

7
+0

असल में मैंने पूछा है कि शेडर्स में वोडू किए बिना यह संभव है ... लेकिन लिंक के लिए +1 :) –

+4

आधुनिक ओपनजीएल * कुछ भी * शेडर्स में * कुछ भी * किए बिना संभव है। मैं 'GL_POINT_SMOOTH' वूडू के अजीब व्यवहार को कॉल करना चाहता हूं। –

+0

"शेडर्स में वूडू" - यह नहीं कि आपको इसके बारे में क्यों सोचना चाहिए, न केवल ड्राइंग सर्कल के संबंध में, बल्कि। कार्यक्रम के साथ बेहतर हो, cuz इस तरह से बाहर से यह कैसे किया जाता है। फिक्स्ड फ़ंक्शन * विरासत * –

7

एक तरह से एक वृत्त-बनावट और टुकड़ा शेडर में एक स्व-निर्मित अल्फा परीक्षण के साथ बिंदु स्प्राइट आकर्षित करने के लिए किया जाएगा:

uniform sampler2D circle; 

void main() 
{ 
    if(texture(circle, gl_PointCoord).r < 0.5) 
     discard; 
    ... 
} 

लेकिन वास्तव में तुम भी के लिए एक बनावट की जरूरत नहीं है यह, क्योंकि एक सर्कल एक अच्छी तरह से परिभाषित गणितीय अवधारणा है। तो बस केवल gl_PointCoord, जो कहते हैं, जिसमें [0,1] वर्ग पूरे मुद्दे अपने वर्तमान टुकड़ा का प्रतिनिधित्व करने का हिस्सा है की जाँच करें:

vec2 coord = gl_PointCoord - vec2(0.5); //from [0,1] to [-0.5,0.5] 
if(length(coord) > 0.5)     //outside of circle radius? 
    discard; 
+0

मुझे स्वयं निर्मित अल्फा परीक्षण की आवश्यकता क्यों है? यदि बनावट अल्फा के साथ आता है तो हार्डवेयर अल्फा मिश्रण पर्याप्त होना चाहिए। क्या यह नहीं होना चाहिए? –

+0

@MichaelIV लेकिन अल्फा परीक्षण को बहिष्कृत किया गया है और अब कोर प्रोफ़ाइल का हिस्सा नहीं है। हो सकता है कि अल्फा ब्लेंडिंग आपके लिए पर्याप्त हो, लेकिन आमतौर पर अल्फा परीक्षण को प्राथमिकता दी जा सकती है, क्योंकि यह "अदृश्य" टुकड़ों के साथ गहराई बफर को प्रदूषित नहीं करता है (और थोड़ा तेज़ भी हो सकता है, क्योंकि 'डिस्कार्ड' शुरुआती है)। और कहा, एक बनावट के बिना विधि वैसे भी बेहतर होगा। –

+0

@MichaelIV कल्पना कीजिए कि आप कई सारे अपारदर्शी लेकिन गोल कणों को आकर्षित करना चाहते हैं (याय, कंफेटी समय!)। अल्फा मिश्रण के बजाय अल्फा परीक्षण का उपयोग करते समय, अपने कणों को गहराई से क्रमबद्ध करने की बिल्कुल आवश्यकता नहीं है। यदि कण किसी भी तरह पारदर्शी हैं, फिर भी, आपको अभी भी उन्हें सॉर्ट करने और अल्फा मिश्रण का उपयोग करने की आवश्यकता होगी, इसलिए वास्तव में 'त्याग' से कार्यक्षमता में सुधार नहीं हो सकता है। –

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