顶点着色器
片段着色器
这个长方形所覆盖到的每一个像素,都会调用一次fragment shader。片段着色器的责任是计算灯光,以及更重要的是计算出每个像素的最终颜色,Fragment是可以被渲染到屏幕上的像素点,fragment shader即用于计算每个像素的颜色等属性
-
精度
Uniform是全局变量,可用于vertex shader和fragment shader。在vertex shader中通常是变换矩阵、光照参数、颜色等,。在fragment shader中通常是雾化参数、纹理参数等
连接Vertex Shader和Fragment Shader成一个完整的OpenGL Shader Program
过程:
一些函数
void glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
参数 target:与 glBindBuffer 中的参数 target 相同;
参数 size :指定顶点缓存区的大小,以字节为单位计数;
data :用于初始化顶点缓存区的数据,可以为 NULL,表示只分配空间,之后再由 glBufferSubData 进行初始化;
usage :表示该缓存区域将会被如何使用,它的主要目的是用于提示OpenGL该对该缓存区域做何种程度的优化。其参数为以下三个之一:
GL_STATIC_DRAW:表示该缓存区不会被修改;
GL_DyNAMIC_DRAW:表示该缓存区会被周期性更改;
GL_STREAM_DRAW:表示该缓存区会被频繁更改;
如果顶点数据一经初始化就不会被修改,那么就应该尽量使用 GL_STATIC_DRAW,这样能获得更好的性能。-
glDrawArrays(GL_TRIANGLES, 0, 3);
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN(扇形): T = [n-1 n-2 n] 1 2 3 4, (GLvoid *)(sizeof(float) *3) 即顶点颜色数据在VBO中的偏移量为3个float的大小,即两个相邻的顶点颜色数据之间的间隔为Vertex结构体中的顶点位置数据大小。由此也可看出,该偏移量是针对每个顶点数据而言的。在OpenGL的世界中,都是针对一个个位置或像素进行绘制的。
图片的像素化
- 要(几何图形)让点线面,变成能在屏幕上显示的像素,就需要Rasterize这个过程
- 光栅化是把GPU的操作转到CPU上了,生成位图缓存,直接读取复用。
- 当使用圆角,阴影,遮罩的时候,图层属性的混合体被指定为在未预合成之前不能直接在屏幕中绘制,所以就需要屏幕外渲染被唤起。