基本的概念:
3d图像的最下的单位是point,vertex,
他们代表三维空间的一个点并且用来构建复杂的物体
主要几下开发的步骤:
1.通常用一组浮点数来表示点,eg:一个正方形
float vertices[] = {
-1.0f, 1.0f, .0f, //左上
-1.0f, -1.0f, .0f, //左下
1.0f, -1.0f, .0f, //右下
1.0f, 1.0f, .0f, //右上
};
2. 为了提高性能,通常需要将浮点数组存放入一个字节缓冲区中 ,所以:
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); //申请内存
vbb.order(ByteOrder.nativeOrder()); //设置字节顺序,其中ByteOrder.nativeOrder()是获取本机字节顺序
FloatBuffer vertexBuffer = vbb.asFloatBuffer(); //转换为float型
vertexBuffer.put(vertices); //添加数据
vertexBuffer.position(); //设置缓冲区起始位置
3. 因为OpenGLES的很多函数功能的使用状态是处于关闭的。
启用和关闭这些函数可以用glEnableClientState、glDisableClientState来完成。
// 指定需要启用定点数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 说明启用数组的类型和字节缓冲,类型为GL_FLOAT
gl.glVertexPointer(3, GL10.GL_FLOAT, , vertexBuffer);
// 不再需要时,关闭顶点数组
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
多边形:
可以通过glFrontFace函数来交换“正面”和“反面”的概念。
glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW); // 设置CW方向为“反面”,CW即ClockWise,顺时针
渲染:
渲染是把物体坐标所指定的图元转化成帧缓冲区中的图像。图像和顶点坐标有着密切的关系。
这个关系通过绘制模式给出。
常用到得绘制模式有GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、
GL_LINES、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。
绘制图形步骤:
1.定义顶点并且转换存储在字节缓冲中;
2.我们使用顶点数组绘制图形,而opengles是默认关闭这个开关的,所以我们要启用它。
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
3.设置绘制的颜色。以下为设置红色
gl.glColor4f(1.0, 0.0, 0.0, 1.0); //R,G,B,A
4.由于我们使用顶点数组,我们必须通知OpenGL顶点的数组在什么地方。需使用函数:
gl.glVertexPointer(
3,//每个顶点的坐标的维数,这里为3xyz
GL10.GL_FIXED,//顶点坐标值的类型为GL_FIXED
0,//数组中数据的偏移值
mVertexBuffer//顶点坐标数据数组
);
5.开始绘图
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0, 9);
函数原型 voidglDrawArrays(int mode, int first, int count)
mode为绘制式,有GL_POINTS、GL_LINES、GL_TRIANGLES、GL_TRIANGLE_STRIP等。
first为数据在数组中的起始位置,读取数据的个数
视图与透视:
我们生活在一个三维的世界——如果要观察一个物体,我们可以:
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。
另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
这些,都可以在OpenGL中实现。
OpenGL变换实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,
都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。
1、模型变换和视图变换
即设置3D模型的位移,旋转等属性。由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,
应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:
glMatrixMode(GL_MODELVIEW);
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代码:
glLoadIdentity();
然后,就可以进行模型变换和视图变换了。进行模型和视图变换,主要涉及到三个函数:
glTranslate*,(*表示这个函数分为float型的glTranslatef和int型的glTranslatex)
把当前矩阵和一个表示移动物体的矩阵相乘。
三个参数分别表示了在三个坐标上的位移值。
glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。
物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。
2、投影变换
投影变换就是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。
(注意,从现在起,坐标可以不再是-1.0到1.0了!)
OpenGL支持两种类型的投影变换,即透视投影和正投影。
投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode函数。
glMatrixMode(GL_PROJECTION);
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
glLoadIdentity();
透视投影所产生的结果类似于照片,有近大远小的效果,比如在火车头内向前照一个铁轨的照片,
两条铁轨似乎在远处相交了。
使用glFrustum函数可以将当前的可视空间设置为透视投影空间。
3、视口变换
当一切工作已经就绪,只需要把像素绘制到屏幕上了。这时候还剩最后一个问题:
应该把像素绘制到窗口的哪个区域呢?
通常情况下,默认是完整的填充整个窗口,但我们完全可以只填充一半。
3d图像的最下的单位是point,vertex,
他们代表三维空间的一个点并且用来构建复杂的物体
主要几下开发的步骤:
1.通常用一组浮点数来表示点,eg:一个正方形
float vertices[] = {
-1.0f, 1.0f, .0f, //左上
-1.0f, -1.0f, .0f, //左下
1.0f, -1.0f, .0f, //右下
1.0f, 1.0f, .0f, //右上
};
2. 为了提高性能,通常需要将浮点数组存放入一个字节缓冲区中 ,所以:
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); //申请内存
vbb.order(ByteOrder.nativeOrder()); //设置字节顺序,其中ByteOrder.nativeOrder()是获取本机字节顺序
FloatBuffer vertexBuffer = vbb.asFloatBuffer(); //转换为float型
vertexBuffer.put(vertices); //添加数据
vertexBuffer.position(); //设置缓冲区起始位置
3. 因为OpenGLES的很多函数功能的使用状态是处于关闭的。
启用和关闭这些函数可以用glEnableClientState、glDisableClientState来完成。
// 指定需要启用定点数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
// 说明启用数组的类型和字节缓冲,类型为GL_FLOAT
gl.glVertexPointer(3, GL10.GL_FLOAT, , vertexBuffer);
// 不再需要时,关闭顶点数组
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
多边形:
可以通过glFrontFace函数来交换“正面”和“反面”的概念。
glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW); // 设置CW方向为“反面”,CW即ClockWise,顺时针
渲染:
渲染是把物体坐标所指定的图元转化成帧缓冲区中的图像。图像和顶点坐标有着密切的关系。
这个关系通过绘制模式给出。
常用到得绘制模式有GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、
GL_LINES、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。
绘制图形步骤:
1.定义顶点并且转换存储在字节缓冲中;
2.我们使用顶点数组绘制图形,而opengles是默认关闭这个开关的,所以我们要启用它。
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
3.设置绘制的颜色。以下为设置红色
gl.glColor4f(1.0, 0.0, 0.0, 1.0); //R,G,B,A
4.由于我们使用顶点数组,我们必须通知OpenGL顶点的数组在什么地方。需使用函数:
gl.glVertexPointer(
3,//每个顶点的坐标的维数,这里为3xyz
GL10.GL_FIXED,//顶点坐标值的类型为GL_FIXED
0,//数组中数据的偏移值
mVertexBuffer//顶点坐标数据数组
);
5.开始绘图
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0, 9);
函数原型 voidglDrawArrays(int mode, int first, int count)
mode为绘制式,有GL_POINTS、GL_LINES、GL_TRIANGLES、GL_TRIANGLE_STRIP等。
first为数据在数组中的起始位置,读取数据的个数
视图与透视:
我们生活在一个三维的世界——如果要观察一个物体,我们可以:
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。
另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
这些,都可以在OpenGL中实现。
OpenGL变换实际上是通过矩阵乘法来实现。无论是移动、旋转还是缩放大小,
都是通过在当前矩阵的基础上乘以一个新的矩阵来达到目的。
1、模型变换和视图变换
即设置3D模型的位移,旋转等属性。由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,
应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:
glMatrixMode(GL_MODELVIEW);
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。这也只需要一行代码:
glLoadIdentity();
然后,就可以进行模型变换和视图变换了。进行模型和视图变换,主要涉及到三个函数:
glTranslate*,(*表示这个函数分为float型的glTranslatef和int型的glTranslatex)
把当前矩阵和一个表示移动物体的矩阵相乘。
三个参数分别表示了在三个坐标上的位移值。
glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。
物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。
2、投影变换
投影变换就是定义一个可视空间,可视空间以外的物体不会被绘制到屏幕上。
(注意,从现在起,坐标可以不再是-1.0到1.0了!)
OpenGL支持两种类型的投影变换,即透视投影和正投影。
投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode函数。
glMatrixMode(GL_PROJECTION);
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
glLoadIdentity();
透视投影所产生的结果类似于照片,有近大远小的效果,比如在火车头内向前照一个铁轨的照片,
两条铁轨似乎在远处相交了。
使用glFrustum函数可以将当前的可视空间设置为透视投影空间。
3、视口变换
当一切工作已经就绪,只需要把像素绘制到屏幕上了。这时候还剩最后一个问题:
应该把像素绘制到窗口的哪个区域呢?
通常情况下,默认是完整的填充整个窗口,但我们完全可以只填充一半。
转载于:https://blog.51cto.com/rzmars/797339