OpenGL 学习记录

1 OpenGL 是封装的接口,其实现为各大vendor厂商,如NV/QCOM调用其GPU实现相关功能。

2 OpenGL由Khronos维护,其是一个由成员提供资金的行业协会,专注于开放媒体标准的创建和维护。

3 GPU是大量的处理单元,针对浮点数的计算大大优于CPU。OpenGL的接口也是针对GPU的

4 一些基本概念:

图元:点/线/三角形; 任何复杂的图形都可以有n多个三角形近似组成

openGL支持的图元:

 GL_POINTSGL_LINE_STRIPGL_LINE_LOOPGL_LINESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN and GL_TRIANGLES

顶点:图元的点的数据;

纹理:可以理解成图片;可以使用纹理画到图元上。

framebuffer:渲染后的数据可以保存在一块缓冲区。

顶点着色器:GPU上处理顶点数据的程序; 可以处理纹理信息,绑定顶点坐标与纹理坐标。

光栅化:将顶点连城的图元,转化成像素点。

片段着色器:GPU上对光栅化后的像素进行着色的程序。

深度depth: 处理图形的前后信息的。

blend:混合两个RGBA信息到像素点上

5  GPU处理数据的步骤:

A 以数组的形式传递3个3D坐标作为图形渲染管线的输入,用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);

B 顶点着色器主要的目的是把3D坐标转为另一种3D坐标,同时顶点着色器允许我们对顶点属性进行一些基本处理。

C (Primitive Assembly)阶段将顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并所有的点装配成指定图元的形状;本节例子中是一个三角形。

D 几何着色器把图元形式的一系列顶点的集合,以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。例子中,它生成了另一个三角形

E 光栅化阶段(Rasterization Stage),这里它会把图元映射为最终屏幕上相应的像素。在片段着色器运行之前会执行(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。

F 片段着色器的主要目的是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方--包含3D场景的数据(比如光照、阴影、光的颜色等等)

G Alpha测试和混合(Blending)阶段。这个阶段检测片段的对应的深度(和模板(Stencil))值(后面会讲),用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查值(alpha值定义了一个物体的透明度)并对物体进行(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。

6 OpenGl的API也就是针对上面的这些功能,

buffer: glBindBuffer等

顶点:  glGenVertexArrays等

纹理的:glBindTexture等

 framebuffer的:glGenFramebuffers等

shader/program的:glCreateShader等

操作等: glScissor/glFlush /glViewport等

7 openGL传递给GPU的数据,一般使用buffer的方式传递,尽量减少数据的传递次数。

将顶点坐标和纹理坐标一块传递给GPU,然后设置读取的方式分别获取对应的信息。

如glEnableVertexAttribArray/ glVertexAttribPointer 

8 顶底着色器只会运行一次,而片段着色器会对每个像素都运行一遍。

9 一些基本的openGl程序:

创建shader: 顶点着色器/片段着色器

glCreateShader

glShaderSource

glCompileShader

创建program并连接shader:

glCreateProgram

glAttachShader

glLinkProgram

创建VBO

glGenVertexArrays

glGenBuffers

glBindVertexArray

glBindBuffer

glBufferData

glVertexAttribPointer --设置vao相关data的读取方式,长度/间隔/offset等

使用shader program

glUseProgram

glBindVertexArray-- bind vao

glDrawArrays -- draw

如果需要处理多次,不需要显示出来,就相当于使用离屏渲染,这就是framebuffer的作用

glGenFramebuffers

glBindFramebuffer

glGenTextures

glTexImage2D

glFramebufferTexture2D-- 将上面创建的texture与framebuffer绑定

每次使用时先glBindFramebuffer, 然后glDrawArrays 就会渲染到刚bind的framebuffer。

获取该framebuffer的渲染内容,直接获取与之绑定的texture就可以。

glBlitFramebuffer -- 可以实现两个framebuffer的传递。

10 三种绘制三角形的方式

GL_TRIANGLES:

以每三个顶点绘制一个三角形。第一个三角形使用顶点v0,v1,v2,第二个使用v3,v4,v5

GL_TRIANGLE_STRIP: 

当前三角形的顶点的连接顺序依赖于要和前面已经出现过的2个顶点组成三角形;

当前顶点是奇数:

组成三角形的顶点排列顺序:T = [n-1 n-2 n].      -->[2, 1, 3]

当前顶点是偶数:

组成三角形的顶点排列顺序:T = [n-2 n-1 n].       -->[0,1,2]

GL_TRIANGLE_FAN:

初始顶点需要是扇形的圆心,前三个顶点逆时针构成第一个三角形。 -->[0, 1, 2]
从第三个顶点开始就满足,就是 (n, 圆心, n-1).   --> [3, 0, 2]. [4, 0, 3]

11 顶点坐标范围是[-1, 1]。 纹理坐标范围 [0, 1]

12  glVertexAttribPointer的使用

void glVertexAttribPointer(	GLuint index,
 	GLint size,
 	GLenum type,
 	GLboolean normalized,
 	GLsizei stride,
 	const void * pointer);

index
Specifies the index of the generic vertex attribute to be modified.
--- 在顶点着色器中使用layout(location = 0)相匹配


size
Specifies the number of components per generic vertex attribute. Must be 1, 2, 3, 4. The initial value is 4.
--- 每个顶点坐标的大小,如xy / xyz /xyzw

type
Specifies the data type of each component in the array. The symbolic constants GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, and GL_UNSIGNED_INT are accepted by both functions. Additionally GL_HALF_FLOAT, GL_FLOAT, GL_FIXED, GL_INT_2_10_10_10_REV, and GL_UNSIGNED_INT_2_10_10_10_REV are accepted by glVertexAttribPointer. The initial value is GL_FLOAT.
-- 数据的类型

normalized
For glVertexAttribPointer, specifies whether fixed-point data values should be normalized (GL_TRUE) or converted directly as fixed-point values (GL_FALSE) when they are accessed. This parameter is ignored if type is GL_FIXED.
-- 是否被标准化,--> 顶点[-1, 1]. 纹理[0, 1]

stride
Specifies the byte offset between consecutive generic vertex attributes. If stride is 0, the generic vertex attributes are understood to be tightly packed in the array. The initial value is 0.
-- 这个数据到下一个数据的间隔

pointer
Specifies a pointer to the first generic vertex attribute in the array. If a non-zero buffer is currently bound to the GL_ARRAY_BUFFER target, pointer specifies an offset of into the array in the data store of that buffer. The initial value is 0.
-- 分为是否使用VBO, 
使用VBO时,是offset的作用,相对于VBO开始数据的偏移量;
不使用VBO时,需要上传到顶点数据指针

13 光栅化: 将点/线/三角形转换成像素,因为像素都是横竖排列的,转成三角形时会出现锯齿形。 所以这就有了抗锯齿技术。

14 shader

顶点着色器:对顶点进行变换。

模型/观察/投影矩阵变换,都是对顶点处理的。

顶点数据基本就是坐标系,平面坐标/三维坐标/四维坐标等。

基本就是对每个坐标点进行平移/旋转/缩放操作。

学习资料:LearnOpenGL CN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值