1. 如何在android上使用OpenGL ES 2.0绘制点
FrameBuffer对象的概念可以参见前面文章AndroidOpenGLES开发教程(23):FrameBuffer。简单的和2D图像类比,FrameBuffer如果对应到二维图形环境中,就是一个2D的内存数组空间,缺省情况为屏幕的显存,也可以创建Offscreen内存空间,此时FrameBuffer可以是一个二维数组,数组每个元素代表一个像素颜色。对于三维图形来说,除了需要代表颜色的二维数组(ColorBuffer),还需要深度二维数组(DepthBuffer)或遮罩数组(StencilBuffer),因此在OpenGL中的FrameBuffer为上述ColorBuffer,DepthBuffer,StencilBuffer的集合。如果手机具有GPU,其缺省的FrameBuffer也是3D屏幕显示区域。通过OpenglES扩展支持,应用程序也可以创建内存中的FrameBuffer对象(不用于屏幕显示)。通过这种应用程序创建的FrameBuffer对象,OpenGL应用可以将图像显示输出重新定向到这个非屏幕显示用FrameBuffer对象中,类似于二维图形绘制中常用的Offscreen技术。和缺省的屏幕显示FrameBuffer一样,由应用程序创建的FrameBuffer对象也是由ColorBuffer,DepthBuffer和StencilBuffer(可选)的集合组成。这些Buffer在FrameBuffer对象中可以称为FrameBuffer-attachable图像,FrameBuffer定义了一些接入点(AttachmentPoint)可以用于连接(Attach)这些Buffer数组。OpenGLES定义了两种FrameBuffer-attachable图像,Texture和renderbuffer,简单的可以将Texture理解为Colorbuffer或是2D图像,renderbuffer对应于depthbuffer。
2. android开发openGL问题
最好能贴出具体的代码,是通过C++原生代码还是直接调用android的SDK关于Opengl的API?如果用得是API,需要具体看下google提供的文档。
3. opengl在安卓上经过光照处理后,模型部分呈现纯白色。但是在PC上是正常的,这一般是什么问题
估计着色器用了手机不支持的特性
4. android opengl es中的模型如何使它透明
关于透明,OpenGL/ES 中可以通过 blend (混色) 来简单实现,混色的基本原理就是把要绘制的物体的颜色与屏幕上已经绘制好的颜色以一定比例来混合,最后的颜色看上去就像半透明一样。
要使用混合先要通过 glEnable 函数来启用
1 glEnable(GL10.GL_BLEND);
然后通过 glBlendFunc 来设置下要使用的混合方法
1 glBlendFunc(sfactor, dfactor);
sfactor 及 dfactor 分别代表源和目标颜色在混合时所占比重的枚举常量。其中 sfactor 可取值包括:GL_ZERO, GL_ONE, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA_SATURATE ; 而 dfactor 可取值包括:GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA。
以下说明及公式中所涉及颜色的R、G、B、A值都是指浮点形式,即范围在 0.0f – 1.0f 之间。
在计算混色时,首先是根据以上的枚举得出源颜色和目标颜色的系数,然后分别与源和目标颜色相乘(乘积大于1时取值1),然后再把得出的结果相加。那么如果假设根据以上枚举得出的RGBA四个成分上的系数分别为 源 sfR, sfG, sfB, sfA, 目标 dfR, dfG, dfB, dfA, 源和目标的颜色成分值分别用 sR, sG, sB, sA 和 dR, dG, dB, dA 表示的话, 最终结果色的 rR, rG, rB, rA 分别为:
rR = sR * sfR + dR * dfR
rG = sG * sfG + dG * dfG
rB = sB * sfB + dB * dfB
rA = sA * sfA + dA * dfA
以上 rR, rG, rB, rA 的值如果大于 1 则最终取值为 1 。
然后再来看看 xfR, xfG, xfB, xfA ( x => s / d )是怎么得出来的。
factor枚举 xfR, xfG, xfB, xfA
GL_ZERO 0, 0, 0, 0
GL_ONE 1, 1, 1, 1
GL_SRC_COLOR sR, sG, sB, sA
GL_DST_COLOR dR, dG, dB, dA
GL_ONE_MINUS_SRC_COLOR 1-sR, 1-sG, 1-sB, 1-sA
GL_ONE_MINUS_DST_COLOR 1-dR, 1-dG, 1-dB, 1-dA
GL_SRC_ALPHA sA, sA, sA, sA
GL_DST_ALPHA dA, dA, dA, dA
GL_ONE_MINUS_SRC_ALPHA 1-sA, 1-sA, 1-sA, 1-sA
GL_ONE_MINUS_DST_ALPHA 1-dA, 1-dA, 1-dA, 1-dA
GL_SRC_ALPHA_SATURATE i, i, i, 1 *
上边的表中最后的 i 取值为 min ( sA, 1-dA )
根据以上公式,
glBlendFunc(GL_ONE, GL_ONE); 即源与目标颜色的RGBA分别相加。
glBlendFunc(GL_ONE, GL_ZERO); 即只取源颜色,这也是默认值。
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 是比较典型的半透明效果,如果源色 alpha 为0,则取目标色,如果源色alpha为1,则取源色,否则视源色的alpha大小各取一部分。源色的alpha越大,则源色取的越多,最终结果源色的表现更强;源色的alpha越小,则目标色“透过”的越多。
此外在一般的渲染过程中,都会把有半透明效果的渲染放到后边,先把不透明的部分在深度测试启用的情况下渲染完, 再关闭深度测试写入(glDepthMask(false)),并渲染半透明的部分。这样就不会出现由于半透明且离镜头近的面被先渲染时污染深度缓冲了。
5. 如何学习android opengl
完成工具的安装以后,继续在Eclipse中创建一个新的Android项目。项目名称虽然不重要,但是该节将与主要活动有关,因此应认真学习掌握。
GLSurfaceView是一个特殊的视图,它为我们管理OpenGL表面并将其绘制到Android视图系统中。它还添加许多可以简化OpenGL使用的功能,包括但并不局限于:
它为OpenGL提供一个专用的渲染线程,使主线程得以继续。
它支持连续或按需渲染,维护屏幕设置以及OpenGL和底层窗口系统之间的接口。代码如下:
@Override
publicvoidonCreate(BundlesavedInstanceState)
{
super.onCreate(savedInstanceState);
mGLSurfaceView=newGLSurfaceView(this);
//检测系统是否支持OpenGLES2.0
=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
=activityManager.getDeviceConfigurationInfo();
finalbooleansupportsEs2=configurationInfo.reqGlEsVersion>=0x20000;
if(supportsEs2)
{
mGLSurfaceView.setEGLContextClientVersion(2);
mGLSurfaceView.setRenderer(newLessonOneRenderer());
}
else
{
return;
}
setContentView(mGLSurfaceView);
}
在onCreate()方法里面主要是创建OpenGLES2.0上下文以及做一些初始化工作。在onCreate()中,调用超类之后的第一件事情就是创建GLSurfaceView。然后确定系统是否支持OpenGLES2.0。因此,我们需要一个可以与全局系统状态相交互的ActivityManager实例,以及使用这个实例来得到设备配置信息,该信息将通知我们设备是否支持OpenGLES2.0。
一旦确定设备是否支持OpenGLES2.0后,就会通知表面视图需要一个与OpenGLES2.0相兼容的视图,然后传递一个自定义渲染。这个渲染将在任何需要调整表面或者绘制一个新的帧的时候被系统调用。我们还通过传递一个不同的渲染来支持OpenGLEs1.x,尽管可能由于APIs的不同,导致我们需要编写不同的代码,但在这一节中,我们将只关注OpenGLES2.0。
最后,我们为GLSurfaceView设置内容视图,它通知Android活动内容应该填补OpenGL表面,代码如下:
@Override
protectedvoidonResume()
{
super.onResume();
mGLSurfaceView.onResume();
}
@Override
protectedvoidonPause()
{
super.onPause();
mGLSurfaceView.onPause();
}
GLSurfaceView要求我们在任何父Activity的onResume()和onPause()方法被调用的时候调用onResume()和onPause()方法。
6. android OpenGl ES 的问题 我给一个模型贴纹理 在我手机上运行的时候 图片只能选取256*256像素的
最简单直接的方法就是把你的图片丢到 drawble文件夹中(如果没有,建一个),不要放在drawable-hdpi,drawable-mdpi,或drawable-ldpi文件夹中即可
7. android 怎么展示3d模型 opengl 还是嵌套u3d
先用3dmax或maya做个模型.然后导出成dae格式.此格式比obj ,3ds等格式都要好.内部是xml语法形式的.可看懂.
你解析之后,用gles 画出来即可
8. android opengl
1:需要哪些包?
这个很难说,要看你的游戏用到什么功能。
2:有必要使用opengl吗?
最好用上,怎么说opengl也是比java更底层的,图像的运算处理效率会更高,而且学好opengl,就算你以后转去做苹果了,或是你的游戏要开发苹果版的,也能快速转型和移植(苹果也是有opengl的)
3:使用opengl做的2d游戏比使用j2me的game包有哪些优势及不足??
opengl的优势上面说了,不足就是会更难入手,首先用opengl的话,你就不能用那些又方便又好用的java接口了,然后要搭建NDK平台,再然后,opengl es(手机上的opengl 叫opengl es)的学习资料很少,很难入门。我个人就用opengl es写过一个2d的应用,用习惯之后就很顺手的。
9. Android OpenGL怎么加载obj模型文件
你会用opengl显示一个带有纹理的三角形吗?
如果会的话你去了解下obj文件格式就可以自己写了(obj文件真的很简单,非常好理解),花不了多少时间。
如果连纹理都不会贴,那还是先把opengl基础搞定再说。