opengl渲染流程

opengl渲染管线是一系列数据处理过程,作用是将应用程序的数据转换到最终渲染的图形。简单来说,opengl渲染流程主要包括顶点变换,图元装配,纹理或着色和光栅化四个阶段。

                                     

                                         图1(截至博客https://www.cnblogs.com/zhanglitong/p/3238989.html

顶点变换:所有的图形在计算机中都是一串串数据,在三维坐标系中可以表示为一个N*3的矩阵,N为顶点的数量,3分别代表x、y、z位置坐标,顶点变换就是通过一系列矩阵变换在坐标系中对顶点进行平移、缩小\放大、旋转等操作;

图元装配:图元装配就是告诉电脑怎么去连接这些顶点,例如三个点,可以画成一个三角形,也可以连成两条直线;

着色,纹理:就是对图元进行颜色渲染或者纹理渲染,注意这里的颜色或者纹理并不代表可以实际看见,必须光栅化后输出帧缓存才能实际可见;

光栅化:经过以上步骤,基本上一个图形就形成了,但是这个图形的坐标还是在自己的坐标系中,光栅化就是将图形的坐标转化为屏幕像素坐标,最终将图元的数学描述转化为用于显示在屏幕上的片段,然后通过帧缓存就可以在电脑上看到一个个美丽的图形。

现代opengl渲染管线严重依赖着色器处理数据,如果不使用着色器,那么用opengl可以做到的可能只有清除窗口内容,因此下面从着色器的角度来讲opengl渲染流程。

什么是着色器呢?opengl红宝书中是这么说的:它是图形硬件设备所执行的一类特殊函数,可以理解为专为图形处理单元(GPU)编译的一种小型程序,opengl内部自带了着色器的编译工具。opengl应用程序本质上可以分为两部分,cpu端,采用C++编写,GPU端,采用glsl语言编写(即着色器)。

opengl红宝书第9版给出的渲染流程:顶点数据->顶点着色器(标准化设备坐标)->细分控制着色器->细分计算着色器->几何着色器->图元装配->裁剪和剪切->光栅化->片元着色器

上面流程包含了目前opengl几乎所有的着色器,但是一般只有顶点着色器片元着色器是必须要的,其他着色器都是可选,但是如果有,相对渲染顺序不会变。

顶点着色器:顶点着色器用于处理顶点相关的数据,一般就是变换矩阵、顶点的颜色、纹理坐标;

这里说一下纹理坐标的事,这里纹理一般指图片,在opengl中,纹理坐标系表示如下:

在opengl中,图片的长度归一化了为1,纹理坐标如(0,1)就表示图片的左上角,在顶点着色器中,纹理坐标的作用就是确定纹理该怎么贴到模型上,如可以正着贴,倒贴,斜贴等,这就需要通过纹理坐标与模型顶点数据对应来完成。

要注意,一旦顶点坐标经过顶点着色器,它们就该是标准化设备坐标

细分着色:细分着色包括细分控制着色器和细分计算着色器,细分控制着色器和细分计算着色器是相互依存的,要么都不要,要么都要,细分着色的作用就是通过面片(patch)来描述一个物体的形状。顶点着色器只能处理每个顶点关联的数据,而细分着色能通过面片的形式分割更多的数据点。细分示例如下图(其中黑色点表示输入的控制点,其他连接处的点就是通过面片细分出来的点):

细分控制着色器:细分控制着色器的一个常见应用就是将输入面片顶点(控制点)传递给细分计算着色器和通过设置细分层次因素,告诉opengl怎么生成顶点,每个顶点的标注化二维坐标(细分坐标)以二维向量(也就是说只有其x和y分量是有效的)的方式保存在变量gl_TessCorrd内,该变量会被传递到细分计算着色器中(注:gl_TessCorrd保存的是一个线段的因子,如一个线段的0.5横坐标处,那么gl_TessCorrd.x=0.5);

细分计算着色器:细分控制着色器完成后,细分计算着色器就通过控制点和细分坐标生成一系列顶点坐标,输出跟顶点着色器是一样的。

细分着色器更具体的可以看文章https://www.jianshu.com/p/3d974e69f842

几何着色器:几何着色器提供了一种更加灵活的图元生成方法,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。原理上来说,几何着色器通过一些手段也可以完成细分着色器的任务,但是为什么需要细分着色器呢?这是因为在某些图元生成上,细分着色器可以更加精确或者方便,比如生成三角形网格顶点。

顶点着色器可以参考博客https://blog.csdn.net/cui6864520fei000/article/details/89949871

综上,我们可以看到,顶点着色器,细分着色器和几何着色器本质上都是对顶点进行处理,因而可以归到图1顶点变换的范畴中。

裁剪和剪切:opengl红宝书中流程中提到了裁剪和剪切,这是一种视口变换,即顶点可能落在我们要绘制的窗口区域以外,视口变换原理很简单,这里不多加赘述。

片元着色器:片元着色器是opengl渲染的最后一个流程,它的主要作用就是赋予我们图形最终的颜色,纹理渲染也在这个阶段,这里要跟顶点着色器区别一下,顶点着色器只是得到纹理坐标,最终还是要传递到片元着色器,用具体的纹理(如一张图片)来渲染。

还有颜色要注意一下,我们可以看到顶点着色器可以每个顶点赋予一个颜色值,那么当传递到片元着色器,如果片元着色器不做其他处理,那么片元将会自动根据顶点颜色进行插值;

//片元着色器
in vec4 Color;//顶点着色器传递过来的每个顶点的颜色
void main
{
 FragColor = Color;
}

opengl渲染的大概流程就是这样,因为平时工作中用到opengl并不是很多,更多是用基于opengl的高级引擎,即使用到opengl一般也大多用它的固定管线模式,因此可能出现错误,请多多指正。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值