androidにはOpenGLを勉強する
16lz
2021-01-25
1.OpenGLを紹介する。
www.baidu.com
2.androidのSDKにはOpenGL関するクラス。
android.opengl
javax.microedition.khronos.egl
javax.microedition.khronos.opengles
3.androidにはOpenGLの勉強要点。
① OpenGL有自己的Surface --> GLSurfaceView
② GLSurfaceView需要你注册一个Renderder,它是GLSurfaceView.Renderer接口,一般来说多是自己实现的,例如里中的SimpleRenderer。
***附件中的 AndroidGL.rar 大家可以下载下来学习一下。
OPENGL ES中几个重要函数详细说明:
一下是我的总结,大家也可以参照这哥们的:
http://student.csdn.net/space.php?uid=46868&do=blog&view=me&page=15
http://student.csdn.net/space.php?uid=46868&do=blog&id=18197
和http://www.cocoachina.com/gamedev/openal/2010/0430/1286_2.html
① gl.glMatrixMode(GL10.GL_PROJECTION);
void glMatrixMode(GLenum mode)
参数
mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: GL_MODELVIEW、 GL_PROJECTION、GL_TEXTURE.
说明
glMatrixMode设置当前矩阵模式:
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
与glLoadIdentity()一同使用
glLoadIdentity():该函数的功能是重置当前指定的矩阵为单位矩阵。
在glLoadIdentity()之后我们为场景设置了透视图。 glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模弄视图矩阵储存了有关物体的信。
② GLU.gluOrtho2D(gl, 0.0f,1.3f,0.0f,1.0f);
gluOrtho2D(GL10 gl, float left, float right, float bottom, float top)
名称
gluOrtho2D定义了一个二维图像投影矩阵
说明
参数 left,right指明平面的左边和右边的垂直坐标
bottom,top 指明平面底部和顶部的水平坐标。
描述:建立了一个可视的二位平面区域。这个和用glOrtho函数效果是一样的当 glOrtho的near=0,far=1时
③ gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
glClear(int mask)
glClear()语句的作用是用当前缓冲区清除值,也就是glClearColor或者glClearDepth等函数所指定的值来清除指定的缓冲区。比如:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲
GL_COLOR_BUFFER_BIT The buffers currently enabled for color writing. 当前可写的颜色缓冲
GL_DEPTH_BUFFER_BIT The depth buffer. 深度缓冲
GL_ACCUM_BUFFER_BIT The accumulation buffer. 累积缓冲
GL_STENCIL_BUFFER_BIT The stencil buffer. 模板缓冲
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
第一条语句表示清除颜色设为黑色,第二条语句表示把整个窗口清除为当前的清除颜色,glClear()的唯一参数表示需要被清除的缓冲区。
④ gl.glShadeModel(GL10.GL_SMOOTH);
void glShadeModel ( GLenum mode);
设置着色模式。参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即 GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。
在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过插值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色插值得到。
⑤ glTranslatef(float x, float y, float z)
glTranslatef是改变你要画的东西的位置。
如glTranslatef(1,2,3)是接下来的东西在(1,2,3)的地方开始画,它一般和 glScalf,glRotatef一起来控制图元的几何特性,用glPushMariex()/glPushMariex()一起控制 图元对象层次。glVertex(x,y,z)如果在后面的话那里面的坐标就是相对 glTranslatef(1,2,3)的了。
例:
int n=45;//定义旋转45度
for(double x=-2;x <=2;x+=0.5)
{
glPushMatrix();//压栈
glTranslatef(x,0.0f,0.0f);//下面物体将在(x,0.0f,0.0f)的位置绘制
glRotatef(n,0.0,1.0,0.0);//沿x,0.0f,0.0f的y轴旋转45度
glPushMatrix();//压栈
glBegin(GL_QUADS);//画正方形
glVertex3f(0,-1.0f,-1.0f);//以下坐标都是相对(x,0.0f,0.0f)的
glVertex3f(0,-1.0f,1.0f);
glVertex3f(0,1.0f,1.0f);
glVertex3f(0,1.0f,-1.0f);
glEnd();
glPopMatrix();//出栈
glPopMatrix();//出栈
}
⑥ gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleBuff);
void glVertexPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *pointer);
指定了需要访问的空间坐标数据。
pointer是数组包含的第一个顶点的第一个坐标的内存地址。
type指定了数组中每个坐标的数据类型(GL_SHORT、GL_INT、GL_FLOAT或GL_DOUBLE)。
size是每个顶点的坐标数量,它必须是2、3或4。
stride是连续顶点之间的字节偏移量。如果stride是0,数组中的顶点便是紧密相邻的。
要访问其他几个数组,可以使用一下的函数:
void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
void glNormalPointer(GLenum type, GLsizei stride,const GLvoid *pointer);
void glFogCoordPointer(GLenum type, GLsizei stride,const GLvoid *pointer);
void glTexCoordPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
⑦ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
......
void glEnableClientState(GLenum array)
指定了需要启用的数组。array 参数可以使用下面这些符号常量:
GL_VERTEX_ARRAY、GL_COLOR_ARRAY、GL_SECONDARY_
COLOR_ARRAY、 GL_INDEX_ARRAY、GL_NORMAL_ARRAY、
GL_FOG_COORDINATE_ARRAY、 GL_TEXTURE_COORD_ ARRAY和GL_EDGE_FLAG_ARRAY
[url] http://www.huachu.com.cn/read/readbookinfo.asp?sectionid=1000003293[/url]
启用定点数组。
从理论上说,最多可能调用这个函数8次,激活8个可用的数组。但是在实践中,
可以激活的数组最多只有6个, 这是因为有些数组不能同时激活。
例如,不可能同时激活GL_COLOR_ARRAY和GL_INDEX_ARRAY。
应用程序的显示模式可以支持 RGBA模式,也可以支持颜色索引模式,但是不
能同时支持这两种模式。
⑧ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);
从数组提供原始数据
void glDrawArrays(GLenum mode, GLint first, GLsizei count);
创建一个几何图元序列,使用每个被启用的数组中从first开始,
到first + count-1结束的数组元素。mode指定了创建的图元类型,它的值和 glBegin()函数所接受的参数值相同。例如:GL_POLYGON、GL_LINE_LOOP、GL_LINES和GL_POINTS等。
⑨ ByteBuffer.allocateDirect(arr.length*4);
ByteBuffer allocateDirect(int capacity)
分配新的直接字节缓冲区。 新缓冲区的位置将为零,其界限将为其容量,
其标记是不确定的。无论它是否具有底层实现数组,其标记都是不确定的。
参数:
capacity - 新缓冲区的容量,以字节为单位
返回:
新的字节缓冲区
抛出:
IllegalArgumentException - 如果 capacity 为负整数
www.baidu.com
2.androidのSDKにはOpenGL関するクラス。
android.opengl
javax.microedition.khronos.egl
javax.microedition.khronos.opengles
3.androidにはOpenGLの勉強要点。
① OpenGL有自己的Surface --> GLSurfaceView
② GLSurfaceView需要你注册一个Renderder,它是GLSurfaceView.Renderer接口,一般来说多是自己实现的,例如里中的SimpleRenderer。
***附件中的 AndroidGL.rar 大家可以下载下来学习一下。
OPENGL ES中几个重要函数详细说明:
一下是我的总结,大家也可以参照这哥们的:
http://student.csdn.net/space.php?uid=46868&do=blog&view=me&page=15
http://student.csdn.net/space.php?uid=46868&do=blog&id=18197
和http://www.cocoachina.com/gamedev/openal/2010/0430/1286_2.html
① gl.glMatrixMode(GL10.GL_PROJECTION);
void glMatrixMode(GLenum mode)
参数
mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: GL_MODELVIEW、 GL_PROJECTION、GL_TEXTURE.
说明
glMatrixMode设置当前矩阵模式:
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
与glLoadIdentity()一同使用
glLoadIdentity():该函数的功能是重置当前指定的矩阵为单位矩阵。
在glLoadIdentity()之后我们为场景设置了透视图。 glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模弄视图矩阵储存了有关物体的信。
② GLU.gluOrtho2D(gl, 0.0f,1.3f,0.0f,1.0f);
gluOrtho2D(GL10 gl, float left, float right, float bottom, float top)
名称
gluOrtho2D定义了一个二维图像投影矩阵
说明
参数 left,right指明平面的左边和右边的垂直坐标
bottom,top 指明平面底部和顶部的水平坐标。
描述:建立了一个可视的二位平面区域。这个和用glOrtho函数效果是一样的当 glOrtho的near=0,far=1时
③ gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
glClear(int mask)
glClear()语句的作用是用当前缓冲区清除值,也就是glClearColor或者glClearDepth等函数所指定的值来清除指定的缓冲区。比如:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲
GL_COLOR_BUFFER_BIT The buffers currently enabled for color writing. 当前可写的颜色缓冲
GL_DEPTH_BUFFER_BIT The depth buffer. 深度缓冲
GL_ACCUM_BUFFER_BIT The accumulation buffer. 累积缓冲
GL_STENCIL_BUFFER_BIT The stencil buffer. 模板缓冲
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
第一条语句表示清除颜色设为黑色,第二条语句表示把整个窗口清除为当前的清除颜色,glClear()的唯一参数表示需要被清除的缓冲区。
④ gl.glShadeModel(GL10.GL_SMOOTH);
void glShadeModel ( GLenum mode);
设置着色模式。参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即 GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。
在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过插值得到。对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色插值得到。
⑤ glTranslatef(float x, float y, float z)
glTranslatef是改变你要画的东西的位置。
如glTranslatef(1,2,3)是接下来的东西在(1,2,3)的地方开始画,它一般和 glScalf,glRotatef一起来控制图元的几何特性,用glPushMariex()/glPushMariex()一起控制 图元对象层次。glVertex(x,y,z)如果在后面的话那里面的坐标就是相对 glTranslatef(1,2,3)的了。
例:
int n=45;//定义旋转45度
for(double x=-2;x <=2;x+=0.5)
{
glPushMatrix();//压栈
glTranslatef(x,0.0f,0.0f);//下面物体将在(x,0.0f,0.0f)的位置绘制
glRotatef(n,0.0,1.0,0.0);//沿x,0.0f,0.0f的y轴旋转45度
glPushMatrix();//压栈
glBegin(GL_QUADS);//画正方形
glVertex3f(0,-1.0f,-1.0f);//以下坐标都是相对(x,0.0f,0.0f)的
glVertex3f(0,-1.0f,1.0f);
glVertex3f(0,1.0f,1.0f);
glVertex3f(0,1.0f,-1.0f);
glEnd();
glPopMatrix();//出栈
glPopMatrix();//出栈
}
⑥ gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleBuff);
void glVertexPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *pointer);
指定了需要访问的空间坐标数据。
pointer是数组包含的第一个顶点的第一个坐标的内存地址。
type指定了数组中每个坐标的数据类型(GL_SHORT、GL_INT、GL_FLOAT或GL_DOUBLE)。
size是每个顶点的坐标数量,它必须是2、3或4。
stride是连续顶点之间的字节偏移量。如果stride是0,数组中的顶点便是紧密相邻的。
要访问其他几个数组,可以使用一下的函数:
void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
void glNormalPointer(GLenum type, GLsizei stride,const GLvoid *pointer);
void glFogCoordPointer(GLenum type, GLsizei stride,const GLvoid *pointer);
void glTexCoordPointer(GLint size, GLenum type, GLsizei stride,const GLvoid *pointer);
void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer);
⑦ gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
......
void glEnableClientState(GLenum array)
指定了需要启用的数组。array 参数可以使用下面这些符号常量:
GL_VERTEX_ARRAY、GL_COLOR_ARRAY、GL_SECONDARY_
COLOR_ARRAY、 GL_INDEX_ARRAY、GL_NORMAL_ARRAY、
GL_FOG_COORDINATE_ARRAY、 GL_TEXTURE_COORD_ ARRAY和GL_EDGE_FLAG_ARRAY
[url] http://www.huachu.com.cn/read/readbookinfo.asp?sectionid=1000003293[/url]
启用定点数组。
从理论上说,最多可能调用这个函数8次,激活8个可用的数组。但是在实践中,
可以激活的数组最多只有6个, 这是因为有些数组不能同时激活。
例如,不可能同时激活GL_COLOR_ARRAY和GL_INDEX_ARRAY。
应用程序的显示模式可以支持 RGBA模式,也可以支持颜色索引模式,但是不
能同时支持这两种模式。
⑧ gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 3);
从数组提供原始数据
void glDrawArrays(GLenum mode, GLint first, GLsizei count);
创建一个几何图元序列,使用每个被启用的数组中从first开始,
到first + count-1结束的数组元素。mode指定了创建的图元类型,它的值和 glBegin()函数所接受的参数值相同。例如:GL_POLYGON、GL_LINE_LOOP、GL_LINES和GL_POINTS等。
⑨ ByteBuffer.allocateDirect(arr.length*4);
ByteBuffer allocateDirect(int capacity)
分配新的直接字节缓冲区。 新缓冲区的位置将为零,其界限将为其容量,
其标记是不确定的。无论它是否具有底层实现数组,其标记都是不确定的。
参数:
capacity - 新缓冲区的容量,以字节为单位
返回:
新的字节缓冲区
抛出:
IllegalArgumentException - 如果 capacity 为负整数
更多相关文章
- Android(安卓)string-array简单使用
- Android中使用httpclient访问服务器,需要session功能
- android Region碰撞
- Android(安卓)中Touch 事件的分发和消费机制
- Android中解析JSON形式的数据
- Android(安卓)ListView的OnItemClickListener()参数详解
- 转载:Android(安卓)常用代码集合
- android状态栏右上角增加图标的方法
- android java json与实体互相转换工具