2012-05-07 27 views
13

में एक क्षेत्र ड्राइंग करना मैं एक क्षेत्र बनाना चाहता हूं, मुझे पता है कि ओपनजीएल में ग्लोबिन() & glEnd() जैसे कॉल का उपयोग करके इसे कैसे किया जाए।ओपनजीएल ईएस

लेकिन ईएस में कुछ भी नहीं है।

सुझाव/ट्यूटोरियल लिंक?

+0

इस प्रश्न को जांचें - http://stackoverflow.com/questions/6072308/problem-drawing-a-sphere-in-opengl-es – alegen

+0

जैसा कि यूआरएल पहले से ही कहता है: http://www.learnopengles.com/ एंड्रॉइड-पाठ-एक-हो रही शुरुआत/ –

उत्तर

41

चूंकि आपने इसे ओपनजीएल ईएस 2.0 के साथ टैग किया है, इसलिए मुझे चिकनी क्षेत्रों के निर्माण के लिए एक वैकल्पिक दृष्टिकोण का सुझाव देना है, और यह उन्हें रेयट्रेटेड impostors के रूप में आकर्षित करने के लिए है। कई शिखरों की गणना करने के बजाय आपको एक चिकनी क्षेत्र को दोहराने की आवश्यकता होगी, आप इस तथ्य का लाभ उठा सकते हैं कि एक क्षेत्र किसी भी कोण से काफी समान दिखता है।

ऐसा करने के लिए, आप निम्नलिखित की तरह एक प्रक्रिया को रोजगार:

Sphere impostor generation

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

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

मैं इस तकनीक का उपयोग this iOS application में करता हूं, जिसके लिए स्रोत कोड उस पृष्ठ पर उपलब्ध है, और इसके बारे में थोड़ा और अधिक here पर बात करें। शिखर शेडर मैं उपयोग का एक सरलीकृत संस्करण कुछ इस तरह दिखता है:

attribute vec4 position; 
attribute vec4 inputImpostorSpaceCoordinate; 

varying mediump vec2 impostorSpaceCoordinate; 
varying mediump vec3 normalizedViewCoordinate; 

uniform mat4 modelViewProjMatrix; 
uniform mediump mat4 orthographicMatrix; 
uniform mediump float sphereRadius; 

void main() 
{ 
    vec4 transformedPosition; 
    transformedPosition = modelViewProjMatrix * position; 
    impostorSpaceCoordinate = inputImpostorSpaceCoordinate.xy; 

    transformedPosition.xy = transformedPosition.xy + inputImpostorSpaceCoordinate.xy * vec2(sphereRadius); 
    transformedPosition = transformedPosition * orthographicMatrix; 

    normalizedViewCoordinate = (transformedPosition.xyz + 1.0)/2.0; 
    gl_Position = transformedPosition; 
} 

और सरल टुकड़ा शेडर यह है:

precision mediump float; 

uniform vec3 lightPosition; 
uniform vec3 sphereColor; 
uniform mediump float sphereRadius; 

uniform sampler2D depthTexture; 

varying mediump vec2 impostorSpaceCoordinate; 
varying mediump vec3 normalizedViewCoordinate; 

const mediump vec3 oneVector = vec3(1.0, 1.0, 1.0); 

void main() 
{ 
    float distanceFromCenter = length(impostorSpaceCoordinate); 

    // Establish the visual bounds of the sphere 
    if (distanceFromCenter > 1.0) 
    { 
     discard; 
    } 

    float normalizedDepth = sqrt(1.0 - distanceFromCenter * distanceFromCenter); 

    // Current depth 
    float depthOfFragment = sphereRadius * 0.5 * normalizedDepth; 
    //  float currentDepthValue = normalizedViewCoordinate.z - depthOfFragment - 0.0025; 
    float currentDepthValue = (normalizedViewCoordinate.z - depthOfFragment - 0.0025); 

    // Calculate the lighting normal for the sphere 
    vec3 normal = vec3(impostorSpaceCoordinate, normalizedDepth); 

    vec3 finalSphereColor = sphereColor; 

    // ambient 
    float lightingIntensity = 0.3 + 0.7 * clamp(dot(lightPosition, normal), 0.0, 1.0); 
    finalSphereColor *= lightingIntensity; 

    // Per fragment specular lighting 
    lightingIntensity = clamp(dot(lightPosition, normal), 0.0, 1.0); 
    lightingIntensity = pow(lightingIntensity, 60.0); 
    finalSphereColor += vec3(0.4, 0.4, 0.4) * lightingIntensity; 

    gl_FragColor = vec4(finalSphereColor, 1.0); 
} 

इन shaders की वर्तमान अनुकूलित संस्करण एक छोटे से कठिन पालन करने के लिए कर रहे हैं, और मैं परिवेश प्रक्षेपण प्रकाश का भी उपयोग करता हूं, जो इनके साथ मौजूद नहीं है। यह भी नहीं दिखाया गया है कि इस क्षेत्र का बनावट है, जो गोलाकार सतह निर्देशांक और आयताकार बनावट के बीच अनुवाद करने के लिए उचित मैपिंग फ़ंक्शन के साथ किया जा सकता है। इस प्रकार मैं अपने क्षेत्रों की सतहों के लिए पूर्ववर्ती परिवेश प्रक्षेपण मूल्य प्रदान करता हूं।

+0

मैंने बिलबोर्डिंग का भी उपयोग किया http://williamedwardscoder.tumblr.com/post/13270747573/when-playing-with-game-engine-ideas-i-struggled; मेरा मुख्य इनपुट यह है कि सर्वोत्तम परिणामों के लिए आपको किनारों को दूसरे पास में खींचना होगा।मैंने OpenGLES 2/webGL पर जाने पर तकनीक को त्याग दिया क्योंकि आप प्रति टुकड़े गहराई को सेट नहीं कर सकते हैं :( – Will

+0

आपके कोड में 'ऑर्थोग्राफिक मैट्रिक्स' क्या है? क्या यह एक मैट्रिक्स है जो हमेशा उपयोगकर्ता का सामना करने के लिए एक वर्ग बदलता है? –

+0

@ SzałPał - यह प्रतिपादन दृश्य के गैर-वर्ग आकार के लिए सही करने का इरादा है। –

0

थ्रेड के ऊपर आने वाले लोग ओपनगलएस 2.0 में "क्षेत्र" सहित विभिन्न प्रकार के आकार बनाने के लिए दिए गए लिंक पर एक नज़र डाल सकते हैं।

https://github.com/regar007/ShapesInOpenGLES2.0

आकार के वर्ग कार्यान्वयन यह बहुत अपने कोड के साथ एकीकृत करने के लिए आसान बनाता है।

ऑब्जेक्ट को इंस्टेंट करें और ऑब्जेक्ट खींचने के लिए फ़ंक्शन प्रस्तुत करें।

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