1、OpenGL | 坐标如何转化为有颜色的像素

OpenGL是一个图形接口函数库,他是用来跟GPU驱动打交道的。

在这里插入图片描述
在OpenGL中,所有的图形都是3D的,所有的2D图形都是从3D转过来的,转化的方法是通过一个叫图形管道的东西,你输入一个3D坐标,就立马给你转换成2D 像素。

转换过程分两部:
1、3D坐标转2D
2、2D坐标转成有颜色的像素

这个转换并渲染的过程,要用到一个叫shaders(着色器)的东西,实际上他不是个东西,只是个小程序,你用GL shading language写成的,给GPU去执行的程序罢了。
有些shaders是我们可以自主编写的,如下图蓝色部分:
在这里插入图片描述
如果再细分的话:
有很多步,比如
第一个,Vertex shader,接收一个叫Vertex Data的数组,来存储3D坐标、颜色、渲染方式等,主要工作是把3D坐标 转为 “特别” 的3D坐标,并对vertex值做个 “基础” 改变。如上图,原语装配阶段将顶点着色器中构成原语 的所有顶点 (如果GL_POINTS被选择,则为顶点) 作为输入,并将给定的原语形状中的 所有点组装起来;在这个例子中是一个三角形。

第二个,Shape shader,我们无法操控,直接送到几何 shader

第三个,几何 Shader,接受一个顶点集合作为输入,它形成一个原语,并且有能力通过发射新的顶点来形成新的(或其他)原语来生成其他形状。在本例中,它从给定的形状生成第二个三角形。

第四个,镶嵌 shader,把给定的原语细分成许多更小的原语。例如,这允许你创建更流畅的环境,通过创建更多的三角形,与player的距离越小。

第五个,光栅化 shader,无法参与。镶嵌着色器的输出被传递到光栅化阶段,将产生的原语 映射到最终屏幕上对应的像素,从而产生片段着色器使用的片段。在片段着色器运行之前,剪切被执行。剪切会丢弃视图之外的任何片段,从而提高性能
其中,片段 (fragment)是OpenGL渲染单个像素所需的所有数据

第六个,片段 shader,主要目的是计算像素的最终颜色,这通常是所有高级OpenGL效果出现的阶段。通常片段着色器包含有关3D场景的数据,它可以用来计算最终的像素颜色(像光,阴影,光的颜色等等)。

第七个, alpha测试和混合,无法控制。最终的对象会通过alpha测试和混合阶段的阶段。这个阶段检查片段的相应的depth(和stencil)值(稍后会讲到),并用这些值来检查产生的片段是在其他对象的前面还是后面,是否该被丢弃。还会检查alpha值(alpha值定义了一个对象的透明度)并相应地混合这些对象。因此,即使一个像素输出的颜色是在fragment shader中计算出来的,当渲染多个三角形时,最终的像素颜色仍然可能是完全不同的。

在实际应用中,由于GPU上没有vertex 和 fragment 的shader,我们自定义vertex shader 和 fragment shader,其他选择默认就行了。

例子:

GLfloat vertices[] = {
   
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};

存储了三角形的三个顶点的3D坐标,把每个vertex的坐标称为标准化的设备坐标,NDC,坐标如下:
在这里插入图片描述
最终,你的NDC坐标会转化为屏幕坐标。使用glViewport提供的数据,通过viewport转换,您的NDC坐标将被转换为屏幕空间坐标,然后转换为片段 作为你的片段着色器的输入。

具体的vertex shader 编写思路,把定义好的vertex数组,送到图形管道第一阶段——vertex shader中,原理是,在GPU上开辟内存存储vertex 数据,配置OpenGL如何去操作这个内存、如何把数据送到显卡。
于是,这个vertex shader 就把我们写到内存的vertex们 逐个处理。

在编程上,我们通过vertex buffer objects(vertex缓冲区对象)管理GPU内存,好处是一次送一堆,因为从CPU把数据送到显卡是相对慢的,你只要把数据放在GPU内存中,shader就执行很快(不用等)。
创建vertex缓冲区代码:

GLuint VBO;
glGenBuffers(1, &VBO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值