2012-02-20 18 views
6

मैं ओपनजीएल ईएस 2.0 गेम (आईओएस पर) लिख रहा हूं। मैं एक शेडर कैसे बना सकता हूं (क्योंकि मुझे लगता है कि यह एक शेडर में करना आसान होगा) ताकि उत्पत्ति (ज़ेड अक्ष पर) से ज्यामिति गहरा दिखाई दे?ओपनजीएल ईएस 2.0 में उनकी गहराई के आधार पर मैं चीजों को कैसे रंग सकता हूं?

इस छवि में पानी मन

Zarch http://www.bytecellar.com/wp-content/uploads/2010/12/Zarch_screen.png

+0

आपको शायद ओपन जीएल ईएस 2.0 प्रकाश व्यवस्था की तलाश करनी चाहिए। – Lordalcol

उत्तर

8

यह काफी ऐसा करने के लिए सरल है तो आप बस अपने ज्यामिति के Z स्थिति उपयोग करना चाहते हैं में प्रभाव रहा है दिखाता है।

attribute vec4 position; 

varying float zDepth; 

uniform mat4 modelViewProjMatrix; 

void main() 
{ 
    vec4 newPosition = modelViewProjMatrix * position; 
    gl_Position = newPosition; 
    zDepth = (2.0 - (1.0 + newPosition.z))/2.0; 
} 

और तरह

varying highp float zDepth; 

void main() 
{ 
    gl_FragColor = vec4(zDepth, zDepth, 0.0, 1.0); 
} 

एक टुकड़ा शेडर जो निम्नलिखित नज़र का उत्पादन होगा::

Depth-shaded OpenGL teapot

मैं का एक उदाहरण है आप की तरह निम्नलिखित एक शीर्ष शेडर हो सकता था यह this iPad sample code के भीतर मैंने अपने ओपनजीएल ईएस 2.0 कक्षा के लिए इकट्ठा किया।

+0

यह अच्छी तरह से काम करता है, खासकर यदि आप वस्तुओं के रंग को शामिल करते हैं। कोड में '2.0' को आपकी जेड गहराई के बावजूद बदलना आवश्यक है। – Piku

0

मैंने @brad प्रदान करने के साथ एक दिलचस्प परीक्षण किया था। मैं बस लाइन बदलता हूं:

gl_FragColor = vec4(1.0, 1.0, 0.0, zDepth); 

अल्फा के साथ कुछ भी नहीं होता है। क्या यह मुझे है या Alpha के लिए कुछ और गायब है?

+0

या तो आपके अधिकांश गहराई मूल्य वास्तव में एक के करीब हैं, या GL_BLEND अक्षम है, साथ ही GlBlendFunc सेट नहीं है। –