OpenGLES 学习笔记

OpenGLES 阅读笔记


Section 1: 基本概念


1> 使用GL定义的数据类型,好处是易移植, 保证数据的大小空间以及精度正确.


2> 只支持三角形.


3> 逆时针次序绘制顶点构成的面是frontface, 可见.


Section 2: 简单绘图


1> glLoadIdentity() 复位成单位矩阵


2> color buffer: 存储当前帧各像素的颜色, 基本上就是屏幕看到的


3> depth buffer: z-buffer 存储像素离观察者的距离信息, 用来确定一个像素是否要绘制. 精度不够的话会产生z-fighting


4> glEnableClientState(GL_VERTEX_ARRAY) 启动顶点数组功能, 告诉其我们使用何种方式提供顶点数据. 与glVertexPointer()匹配


5> glEnableClientState(GL_COLOR_ARRAY) 启动颜色数组功能, 告诉其我们使用何种方式提供颜色数据. 与glColorPointer() 匹配


6> glDrawElements() 使用顶点索引来降低重复顶点内存开销


Section 3: 透视


1> 正交投影: 射线不相交

glOrthorf( -1.0f, // left

  1.0f,  // right

-1.0 / (width/height), // bottom

1.0 / (width/height), // top

0.01, // Near

10000.0) // Far


2> 透视投影: 近大远小

GLFloat size = 0.01 * tanf(DEGREES_TO_RADIANS(45.f) / 2.f);

glFrustumf(-size, // Left

size, // Right

-size / (width / height), // Bottom

size / (width / height), // Top

0.01, // Near

10000.f) // Far


Section 4: 光效


1> 默认未开启光效, 只是提供一种十分单调的整体光让我们看见物体. 


2> 阴影模型:

GL_FLAT: 将制定三角形上的每个像素具有相同的颜色

GL_SMOOTH: 平滑但较快速的阴影算法


3> glEnable(GL_LIGHTING) 启动光效, 只需要在设定时启动一次就可以了. 


4> glEnable(GL_LIGHT0) 启动光源


5> glLightfv(GL_LIGHT0, GL_AMBIENT, light0Ambient) 设置环境光, 通常只指定一个光源的环境光


6> glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diffuse) 设置散射光, 定向光, 只有面向光源的物体面才会反射散射光


7> glLightfv(GL_LIGHT0, GL_SPECULAR, light0Specular) 设置高光, 会以热点和光晕的形式反射到观察者眼中


8> glLightfv(GL_LIGHT0, GL_POSITION, light0Position) 设置光源位置


9> glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light0Direction) 设置光照方向


10> glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0) 设置光照角度 总角度为90.0, GL_SPOT_CUTOFF最大值为180.0


11> 使用手电筒光时, 需要表面法线来确定光线是怎样与各多边形交互作用的. 

       三角形表面法线: 两边的叉积

顶点法线:  使用了该顶点所有表面法线的平均向量.


12> glEnableClientState(GL_NORMAL_ARRAY) 启动法线数组


13> glNormalPointer(GL_FLOAT, 0, normals) 传递法线数组


Section 5: 材质


1> 材质是如何反射光效三要素的.


2> OpenGLES仅支持 GL_FRONT_AND_BACK 为正面和背面指定相同的材质


3> glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, ambientAndDiffuse) 同时指定环境光与散射光


4> glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular) 指定高光


5> glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 25.0) 指定高光热点, 值越大, 热点越小.


6> 高光通常在低面片物体上表现不好, 解决方案有两个 (1) shader (2) texture


7> 自发光,只会影响自己,其周边物体不会收到影响. 


8> glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission) 设置自发光颜色


Section 6: 纹理及纹理映射


1> glEnable(GL_TEXTURE_2D) 启动纹理映射功能, 只需要在启动时打开就可以了.


2> glEnable(GL_BLEND) 打开混色, 提供了通过指定源和目标怎样组合而合成图像的功能, 如纹理和多边形表面合成.


3> glBlendFunc(GL_ONE, GL_SRC_ONE) 混色函数,  绘制的纹理完全不透明而忽略多边形中现存的颜色或者纹理.


4> 创建纹理最好在加载之前, 如果在显示之前创建,会引起明显的程序停顿


5> 纹理不能单独显示,必须映射到物体上


6> glGenTextures(1, &texture) 生成纹理, 是个GLuint


7> glBindTexture(GL_TEXTURE_2D, texture) 绑定纹理, 使其处于激活状态, OpenGLES只支持二维纹理


8> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) 纹理需要被收缩到适合多边形的尺寸时用到 简单的线性插值方法

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) 纹理需要被放大到适合多边形的尺寸时用到 简单的线性插值方法


9> mipmap技术 允许OpenGL选择最为接近的尺寸版本以避免过多的插值计算并且在物体远离观察者时通过使用更小的纹理来更好的管理内存. 不过iPhone的图形芯片在图像插值方面做的很好, 不需要考虑mipmap技术了. 


10> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData) 加载纹理数据,

       若UIImage不支持一种文件类型, 可以通过类别来增加该文件类型的支持. 


11> 加载纹理的两种方式

(1) UIImage 最普通的方式

(2) PVRTC: PoverVR MBX提供了对PVRTC压缩技术的硬件支持, 缺点时图像质量会下降,优点是可以节省大量的内存空间. texturetool 是命令行工具提供了将标准的jpeg/png 转化为pvrtc格式. 


12> 纹理限制: 宽高必须为2的n次方, 若是pvrtc格式的话,源必须是正方形, 若不是可以给图像加黑边.


13> 纹理坐标y轴翻转 UIImage: 在context中给个翻转. PVRTX: 做图时就翻转


14> glEnableClientState(GL_TEXTURE_COORD_ARRAY) 打开纹理坐标数组

glTexCoordPointer(2, GL_FLOAT, 0, texCoords) 传递纹理坐标数组


15> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) S轴平铺

       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) T轴平铺


16> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) S轴clamp

       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) T轴clamp


Section 7: 矩阵


1> glMatrixModel(GL_MODELVIEW) 设置活动矩阵


2> 向量处理器可以完成硬件级别的矩阵相乘 (VFP数学库)


3> 多轴旋转使用矩阵会产生其中一个轴的旋转被锁定,可以使用四元数来实现我的


4> 可以实现剪切矩阵, 物体沿两轴扭转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值