图形渲染管线(Graphics Pipeline)
一堆原始图形数据途径一个输送管道,期间经过各种变化处理最终出现在屏幕的过程。OpenGL中是将3D空间坐标转换成为2D像素坐标。
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。
图形渲染管线实际上指的是一堆原始图形数据途径一个输送管道,期间经过各种变化处理最终出现在屏幕的过程;图形渲染管线可以被划分为两个主要部分:第一部分把开发者的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际带有颜色的像素
顶点数组对象(Vertex Array Object,VAO)
顶点缓冲对象(Vertex Buffer Object,VBO)
索引缓冲对象(Element Buffer Object,EBO或Index Buffer Object,IBO)
着色器(Shader)
当前显卡都有成千上万的小处理核心,它们在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据,这些小程序叫做着色器(Shader)
图元(Primitive)
提示我们所想渲染的类型,如GL_POINTS、GL_TARIANGLES、GL_LINE_STRIP
标准化设备坐标(Normalized Device Coordinates,NDC)
一旦顶点坐标已经在顶点着色器中处理过,它们就是标准化设备坐标了,标准化设备坐标是一个X、Y和Z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在屏幕上。与通常的屏幕坐标不同,y周正方向为向上,(0,0)坐标是图像的中心,而不是左上角。
接着标准化设备坐标会变换为屏幕空间坐标(Screen-space Coordinates),这是使用通过glViewport函数提供的数据,进行视口变换(Viewport Transform)完成的。所得的屏幕空间坐标又会被变换为片段输入到片段着色器中
基本数据类型
Vec2:包含了两个浮点数的向量
Mat2:2*2的浮点数矩阵
Sampler2D:用于访问浮点型的二维数组
Vec3 position[20]:声明了一个包含20个vec3的数组,索引从0开始
Vec3 va = vec3(0.5,0.5,0.5):声明了一个vec3向量va
Vec4 myVec4 = vec4(1.0):myVec4的每一个分量值都是1.0
一个图形渲染器管线的每个阶段抽象流程展示:
1、顶点数据(Vertex Data[])
2、顶点着色器(Vertex Shader):把3D坐标转换成为另一种3D坐标
3、形状(图元)装配(Shape assembly):将所有的点装配成指定图元的形状(三角形、点、线)
4、几何着色器(geometry Shader):产生新顶点构造出新的或者是其它的图元来生成其它形状
5、光栅化(rasterization):把图元映射为最终屏幕上相应的像素,生成供片段着色器使用的片段,在片段着色器运行之前会执行裁剪(Clipping)
6、测试与混合(tests and blending):检测片段的深度
小技巧:
OpenGL使用
GLSurfaceView.queueEvent(new Runnable(){
//GL线程做的事情
}):
可以将操作放到GLThread线程中进行执行