Skip to content

Android OpenGL ES 教程

cheyiliu edited this page Oct 15, 2014 · 11 revisions

笔记

基础部分 1,2 基本概念 + 简单绘图概述

  • 图像构成:点 线 三角形。

  • front face(前面),backface(背面),Backface Culling(隐面消除)。

  • “复位开关”,glLoadIdentity() 它将清除虚拟世界中的一切旋转,移动或其他变化并将观察者置于原点。

  • glClearColor(0.7, 0.7, 0.7, 1.0);清除颜色,RGBA颜色值,是0.0 到 1.0之间的浮点数。

  • glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);清除颜色缓存(color buffer) 和 深度缓存(depth buffer)。

  • glEnableClientState(GL_VERTEX_ARRAY);启动OpenGL的一项称为vertex arrays(顶点数组)的特性。

  • glColor4f(1.0, 0.0, 0.0, 1.0);设置了绘图时所需的颜色。此行代码将绘图颜色设为鲜艳的红色。现在,直到下次调用 glColor4f()前所有的图形都是以红色绘制。

  • glVertexPointer(3, GL_FLOAT, 0, &triangle);通知OpenGL顶点的数组在什么地方。

  • glDrawArrays(GL_TRIANGLES, 0, 9);通知OpenGL通过刚才提交的顶点数组来绘制三角形。

  • glDisableClientState(GL_VERTEX_ARRAY);禁止先前启动了的特性以保证不会被其他地方的代码弄混。

  • 正如 OpenGL ES 允许你将所有顶点置于一个数组中,它还允许你将每个顶点使用的颜色置于一个颜色数组(color array)中。 通过下面方法启动颜色数组:glEnableClientState(GL_COLOR_ARRAY);

  • 记住:如果你按绘制的正确次序提供顶点,那么你应该使用glDrawArrays(),但是如果你提供一个数组然后用另一个以索引值区分顶点次序的数组的话,那么你应该使用glDrawElements()。

基础部分 3 透视

  • OpenGL视口(viewport)虚拟世界是没有边界的,但计算机不可能处理无限的空间,所以OpenGL需要我们定义一个可以被观察者看到的空间。
  • OpenGL ES中具有的两种不同的视口类型:正交和透视。
    • 透视(perspective)。OpenGL可以设定的视口中的一种就是使用透视。当你这样设置视口时,物体会随着移远而越来越小,视线会在物体移离观察者时最终交汇。这是对真实视觉的模拟;人们就是以这种方式观察世界的。glFrustumf();glViewport(); 透视图例
    • 正交(orthogonal) 视口。这种类型的视口,视线永远不会交汇而且物体不会改变其大小。没有透视效果。对于CAD程序以及其他各种目的是十分方便的,但因为它不像人们眼睛观察的方式所以看上去是不真实的,通常也不是你所希望的。正交视口的优点是容易定义。因为线永不交汇,你只需定义一个像箱子一样的3D空间 glOrthof(); glViewport(); 正交图例

基础部分 4 光效

  • OpenGL在没有设置光效的情况下仍然可以看见东西。 它只是提供一种十分单调的整体光让我们看到物体。
  • 阴影模型(Shade Model)
    • GL_FLAT,我们将不会讨论GL_FLAT,因为这只会让你的程序看上去来自九十年代。从发光的角度来看,GL_FLAT将指定三角形上的每个像素都同等对待。多边形上的每个像素都具有相同的颜色,阴影等。它提供了足够的视觉暗示使其看上去有立体感而且它的计算比每个像素按不同方法计算更为廉价,但是在这种方式下,物体看上去极为不真实。现在有人使用它可能是为了产生特殊的复古效果,但要使你的3D物体尽量真实,你应该使用 GL_SMOOTH 绘图模式,它使用了一种平滑但较快速的阴影算法,称为Gouraud 算法。 GL_SMOOTH是默认值。
    • GL_SMOOTH
  • 启动光效
    • glEnable(GL_LIGHTING);通常情况下,光效只需在设定时启动一次。不需要在绘图开始前后打开和关闭。可能有些特效的情况需要在程序执行时打开或关闭,但是大部分情况下,你只需在程序启动时打开它。
    • glEnable(GL_LIGHT0);OpenGL ES允许你创建8个光源。有一个常量对应于这些光源中的一个,常量为GL_LIGHT0 到 GL_LIGHT7。可以任意组合这些光源中的五个,尽管习惯上从 GL_LIGHT0 作为第一个光源,然后是 GL_LIGHT1 等等。下面是“打开”第一个光源GL_LIGHT0的方法: glEnable(GL_LIGHT0);
  • 光效三要素 图例
    • 环境元素(ambient component)
    const GLfloat light0Ambient[] = {0.05, 0.05, 0.05, 1.0};
    glLightfv(GL_LIGHT0, GL_AMBIENT, light0Ambient);
  • 散射元素(diffuse component)
    const GLfloat light0Diffuse[] = {0.5, 0.5, 0.5, 1.0};
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diffuse);
  • 高光元素(specular component)
    const GLfloat light0Specular[] = {0.7, 0.7, 0.7, 1.0};
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0Specular);
  • 位置
    const GLfloat light0Position[] = {10.0, 10.0, 10.0, 0.0};
    glLightfv(GL_LIGHT0, GL_POSITION, light0Position);
  • 创建点光源(聚光灯)
    • 指定光的方向
    const GLfloat light0Direction = {0.0, 0.0, -1.0};
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light0Direction);
  • 指定光的角度
    glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);
  • 指定顶点法线 TODO

ref

Clone this wiki locally