Opengl ES 阴影(shadow)

来源:互联网 发布:网络医生咨询是真的吗 编辑:程序博客网 时间:2024/05/17 22:44

转自:http://blog.csdn.net/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.csdn.net/kesalin/archive/2008/01/19/2053692.aspx,很不错的探讨阴影的文章。

 

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

 


原创粉丝点击