Opengl ES 阴影(shadow)

本文介绍了Opengles中实现阴影效果的三种主要方法:动态贴图、StencilBuffer及Shader技术。动态贴图通过额外Framebuffer生成光源视角的物体剪影并贴到目标Framebuffer;StencilBuffer利用Opengl自带的辅助缓冲区生成阴影;Shader则通过OpenGLES2.0实现更高级阴影效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/mink365/article/details/6303055




Opengl es有多种呈现shadow的方式,具体分以下三种:

 

1.动态贴图,即是另外打开一个Framebuffer,绘制此块Framebuffer时,把相机移动到光源位置,得到从光源位置看上去的物体剪影,并把此剪影作为贴图贴到真正的Framebuffer上,完成阴影绘制。具体参照3D绘图程序设计中的7.4节。此种阴影真实性较好,而且可以是用柔化技巧生成Soft-shadow(7.6节),缺点是需要多用一个Framebuffer,而且获取Framebuffer Object需要硬件支持,android SDK中的APIDemos下的FrameBufferObjectActivity演示了获取Framebuffer Object和是用它的方法。可以看到,使用了GL11ExtensionPack

 

2.Stencil Buffer,Stencil Buffer是Opengl系统自带的测试工作区,于Zbuffer(Depth)类似,是一个辅助Buffer,用于确定那些区域需要更新等。用Stencil Buffer也可以生成阴影。具体参照8.4节。http://insanitydesign.com/wp/projects/android-tutorials/,一个android下的例子。

 

3.Shader,更高级的阴影就只有使用Shader语言了,也就是说,必须用OpenGL ES 2.0的东西。APIDemos中的GLES20Activity,和BasicGLSurfaceView演示了gles2.0的使用。有趣的是,忽略了传入的GL10,直接是用静态的GLES10调用。http://developer.android.com/reference/android/opengl/GLES10.html有完整的函数列表。android有一个自己的android.opengl的packages,而我们使用GL10的东西,默认引入的是javax.microedition.khronos.opengles。

 

其实还有一个做阴影的方法:自己设计矩阵,并把自己的矩阵是用glMultMatrixf导入Projection矩阵。只是,这个,呵呵,有点变态了。http://www.devmaster.net/articles/shadowprojection/

 

看WIKI:http://en.wikipedia.org/wiki/OpenGL_ES#OpenGL_ES_1.1_2,可见Opengl ES从android 1.6已经正式支持了,应该可以在项目中放心使用了吧??ES2.0的支持在android 2.2引入。

 

http://blog.youkuaiyun.com/kesalin/archive/2008/01/19/2053692.aspx,很不错的探讨阴影的文章。

 

http://insanitydesign.com/wp/tag/opengl-es/,NEHE的android移植项目,非常值得一看。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值