OpenGL笔记(一) Tips


一、一些概念:

GLTools: 一些有用且可复用的函数

GLEW: OpenGL API的一些扩展机制

GLUT: OpenGL Utility toolkit, OpenGL跨平台相关,隐藏平台相关细节

RC代表渲染环境(Rendering Context),是运行中的OpenGL状态机句柄

固定渲染模式限制了开发者的自由,目前一般都是采用核心模式(Core-profile)

跨距Stride

可以用2个数组分别描述位置和颜色信息,这样必须保证两个数组中顶点的位置和颜色是否一一对应。

除了这种方式,还可以选择一个数组存储两种信息的方式:“顶点1位置+顶点1颜色+顶点2位置+顶点2颜色+”,这样就引出了跨距的概念,即一个顶点和颜色占用的空间个数之和。

OpenGL的操作方式

由跨距可以看出,OpenGL操作时,一般都是将所需的数据准备好,然后调用glDrawElements函数一次绘制完成,而不是通过某个函数一个顶点一个顶点的去渲染,这是OpenGL渲染的一个特点。

二、开发重点

1. 顶点着色器

每个顶点执行一次,比如我们绘制一个线段,包含了2个顶点,那就是执行2次顶点着色器。我们传递给顶点着色器的数据不仅包含了每个顶点的位置,也包含颜色

2. 片段着色器

3. 将数据传递给着色器

顶点和片段着色器用于描述如何绘制图形图像的环节;

GLSL:OpenGL编写着色器具体实现的编程语言;

三、归一化坐标

顶点的归一化坐标是[-1,1];

纹理的归一化坐标是[0,1],两位维度分别是S、T,一般称为ST纹理坐标或UV坐标;如果设置的纹理坐标小于1,意思是将纹理的一小部分贴到顶点坐标中去;大于1,纹理边界将会拉伸。

纹理坐标方向性在Android上与我们平时熟悉的Bitmap、Canvas等一致,都是顶点在左上角。

四、纹理

1. 纹理:在OpenGL中简单理解就是一张图片

2. 纹理ID:纹理的直接引用

3. 纹理单元:纹理的操作容器,有GL_TEXTURE0、GL_TEXTURE1、GL_TEXTURE2等,纹理单元的数量是有限的,最多16个。所以最多只能同时操作16个纹理。在切换使用纹理单元的使用,使用glActiveTexture方法。

4. 纹理目标:一个纹理单元中包含了多个类型的纹理目标,有GL_TEXTURE_1D,GL_TEXTURE_2D等

5. 纹理ID与纹理单元的关系

OpenGL要操作一个纹理,那么是将纹理ID装进纹理单元这个容器里,然后再通过操作纹理单元的方式去实现。

OpenGL的大部分纹理一般都只接受RGBA类型的数据,如果不是RGBA,比如YUV420P格式,可以在显卡中进行转换。

五、glDrawArrays顶点法和glDrawElements索引法的绘制区别

 1. glDrawArrays只能是依次输入所绘制的每个三角形的每个数据,而glDrawElements需要输入每个定点(无需重复),外加一个绘制时的索引数组。

glDrawArrays传输或指定的数据是最终的真实数据,在绘制时效能更好;

glDrawElements指定的是真实数据的调用索引,在内存/显存占用上更节省;

glDrawArrays的数据空间损耗在顶点定义处;glDrawElements的数据空间损耗在顶点索引的定义处;

2. 适用情况

如果顶点复用情况较少,可以采用glDrawArrays;如果顶点复用情况多,画的图形较多,而且大不相同的时候,优先采用glDrawElements。

顶点法内存计算方式:顶点数 * 顶点属性数 * 顶点数据格式类型;

索引法内存计算方式:顶点数 * 顶点属性数 * 顶点数据格式类型 + 索引数 * 索引数据格式类型

3. 输入坐标时一定要输入完整,比如带.0f

4. draw mode

比较关键的一个参数,2D绘制一般采用GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN。

GL_TRIANGLE_STRIP:相邻3个点构成一个三角形,不包括首位两个点,例如ABC、BCD、CDE、DEF

GL_TRIANGLE_FAN:第一个点和之后所有相邻的2个点构成一个三角形,例如ABC、ACD、ADE、AEF

六、纹理

1. 环绕方式

GL_CLAMP_TO_EDGE:纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果

GL_REPEAT:对纹理的默认行为。重复纹理图像。

2. 纹理过滤

GL_NEAREST邻近过滤,是OpenGL默认的纹理过滤方式。当设置为GL_NEAREST的时候,OpenGL会选择中心点最接近纹理坐标的那个像素。

GL_LINEAR线性过滤,它会基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM