OpenGL渲染管线漫谈

如果把OpenGL看做一个加工机器,它的功能就是把一系列顶点纹理数据可以在屏幕上面显示的像素。这就如同面条机器把一定比例的面和水加工成一根根面条一样。面条机器可以设置面条的宽度和厚度,这可以影响整个加工的面条,就相当于OpenGL可以设置纹理过滤模式,混合模式等全局状态,可以影响到这一帧的像素输出。从glDrawElements开始,OpenGL流水线就开始运作了,它由一系列过程串联而成,其中有些是程序可以操作的,比如顶点片段着色器;有些戏系统根据设置的全局OpenGL状态自动作用的,比如纹理采样和光栅化。

顶点着色:

这个过程完全由程序掌握,它可以使用所有传人的attribute和uniform变量。一般attribute变量包括位置,颜色,纹理,法线,uniform包括变换矩阵,灯光位置。输出包括变换后的顶点位置,通过视图投影变换,把位置变换为0~1之间,如果不再这个范围内,这个点在后面的剪切过程中剪切剔除掉,并由其它新生成的点代替。很多情况下也会包括纹理坐标,某些情况也会计算顶点的光照颜色。这些输出除了位置都是作为varying变量传递到下一个管线。

细分着色和集合着色:

顶点着色输出的是各个顶点数据,这两个过程会对顶点进行更进一步处理,比如创建更多图元。这两个过程在游戏中很少用到。所以一般可从顶点着色直接跳到下一步。

图元装配:

前面都是对顶点的处理,这里会把前面的顶点重新组装称为图元,比如一个个三角形。组装的原则是根据glDrawElements设置的参数,比如GL_TRIANGLES。

剪切:

在顶点着色中生成的顶点位置如果不再0~1之间,在这里会被剪切掉,通过剪切掉不必要的图元,会显著降低后面流程的工作量。这个部分完全由gl操作。

光栅化:

上面所有步骤输出的结果是一个个多边形,而最终显示的是一个个像素区域。这一步所做的就是把多边形通过插值生成一个个片段,即候选像素。除了位置,还有顶点着色输出的varying类型都会被插值,一般包括纹理坐标,法线坐标。

片段着色:

这一步计算光栅化之后每个片段的对应颜色和深度值,这是完全可编程的,也可以根据判断丢弃本片段。

剪切测试:

如果片段在glScissor范围之外,则直接丢弃。本过程完全由OpenGL处理。

模板测试:

可以用来实现倒影镂空等特效。测试失败则根据设置修改输出帧缓冲的模板值,然后丢弃;否则进行下面的深度测试。本过程完全由OpenGL处理。

深度测试:

如果失败则只根据设置修改模板值,然后丢弃。否则修改模板深度缓存并进行到下一步。本过程完全由OpenGL处理。

alpha混合:

混合前面计算的像素颜色和当前缓存的颜色,可用于半透明效果。本过程完全由OpenGL处理。

后面还有抖动和逻辑操作处理,但是对于一般游戏开发来说,alpha混合之后,就相当于得到显示到屏幕的颜色了。

这个流程完全是串行处理的,要降低后面的计算量,就要尽可能在更前面的步骤剔除掉不会最终显示的图元片段。程序可以操作的地方有两个。一个是在进入OpenGL管线之前,尽可能通过场景管理剔除掉不需要的图元;另一个是采用由近及远的画法,在深度测试中丢弃不会显示的片段。可以看到场景管理尤其重要,好的场景算法可以大大降低显卡的负担。

时间: 2024-08-01 10:44:43

OpenGL渲染管线漫谈的相关文章

OpenGL: 渲染管线理论

http://blog.csdn.net/augusdi/article/details/19934463 学习着色器,并理解着色器的工作机制,就要对OpenGL的固定功能管线有深入的了解. 首先要知道几个OpenGL的术语 渲染(rendering):计算机根据模型(model)创建图像的过程. 模型(model):根据几何图元创建的物体(object). 几何图元:包括点.直线和多边形等,它是通过顶点(vertex)指定的. 最终完成了渲染的图像是由在屏幕上绘制的像素组成的.在内存中,和像素

OpenGL渲染管线概览

翻译自OpenGL Wiki:http://www.opengl.org/wiki/Rendering_Pipeline_Overview,如有错误还请赐教 管线 OpenGL渲染管线按以下方式工作: 1. 准备顶点数组数据并渲染 2. 顶点处理: 1. 每个顶点都要经过顶点着色器处理.每个顶点按所在数据流中的             顺序依次处理为输出顶点: 2. 可选的图元曲面细分阶段: 3. 可选的图元几何着色器处理,输出为一系列基本图元: 3. 顶点后处理,上一阶段的输出被调整或移位到不

现代OpenGL渲染管线介绍

原文摘选自 现代OpenGL渲染管线介绍 此文对最新的OpenGL做一个简单的介绍,如有理解错误,敬请指正.英文原文: https://glumpy.github.io/modern-gl.html opengl已经发展了很多年,自从2003年后提出dynamic pipeline(OpenGL 2.0)后发生了重大变化,例如 shader的使用允许直接对GPU操作 在这个版本之前,OpenGL使用固定管线(fixed pipeline),现在仍旧可以找到很多使用固定管线的手册,这篇文件将介绍O

统一D3D与OpenGL坐标系统

作者:游蓝海(http://blog.csdn.net/you_lan_hai) DirectX 3D与OpenGL坐标系统的差异性,给我们带来很大的麻烦,让跨平台编程的新手很困惑.最近在做一个跨平台的游戏,仔细看了下两者的矩阵,发现并没有什么大区别,将d3d左手系的矩阵传递给opengl shader完全可以正常工作. 先说一下两者一些概念上的区别:         (1)坐标系统不同 d3d左手坐标系,opengl右手坐标系         (2)矩阵行序不同 d3d行优先,opengl列优

OpenGL 开始学习指南

近期需要做一个涌潮的预报与仿真模拟,为了使模型更具有真实感,且逼真,使用起来更灵活.感觉还是得从基础的OpenGL学习.鉴于Direct3D技术存在的众多不确定性,且评论不太好的原因,决定用OpenGL来做.但是,之前接触的都是一些十分简单的OpenGL的管线变成,预计得舍弃并用现代版的OpenGL的着色语言进行实现. 下面给出一些自己在网上总结的学习OpenGL的一些建议,特别是初学者,可以拿来参考以下. 1.入门与学习资源 入门如果用NEHE,该经典教程确实众所周知,但也意味着老旧,全是固定

OpenGl 坐标转换 (转载)

OpenGl 坐标转换 (转载) 1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(ModelView Transformation)和投影变换(Projection Transformation).做个比喻,计算机图形开发就像我们照相一样,目的就是把真实的场景在一张照相纸上表现出来.那么观测变换的过程就像是我们摆设相机的位置,选择好要照的物体,摆好物体的造型.而投影变换就像相机把真实的三维场景显示在相纸上一样.下面就分别详细的讲一下这两个过程. 1.1模型观测变换

基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个三角形(1)

[本系列转自]http://cn.cocos2d-x.org/tutorial/lists?id=79 前言 在本系列教程中,我会以当下最流行的2D引擎Cocos2d-x为基础,介绍OpenGL ES 2.0的一些基本用法.本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2d-x过程中,知其然,更知其所以然.本系列教程不会涉及非常底层的数学原理,同时也不会过多地提及OpenGL本身的一些细节知识.但是我会在每篇文章的最后给出一些参考链接,大家可以顺藤摸瓜,一举Get OpenGL这个新

基于Cocos2d-x学习OpenGL ES 2.0系列——编写自己的shader(2)

在上篇文章中,我给大家介绍了如何在Cocos2d-x里面绘制一个三角形,当时我们使用的是Cocos2d-x引擎自带的shader和一些辅助函数.在本文中,我将演示一下如何编写自己的shader,同时,我们还会介绍VBO(顶点缓冲区对象)和VAO(顶点数组对象)的基本用法. 在编写自己的shader之前,我觉得有必要提一下OpenGL渲染管线. 理解OpenGL渲染管线,对于学习OpenGL非常重要.下面是OpenGL渲染管线的示意图:(图中淡蓝色区域是可以编程的阶段) 此图是从wiki中拿过来的

OpenGL顶点数组

概述 作为在立即模式(glBegin()与glEnd()之间)下指定单个顶点数据的替代,你可以保存顶点数据在一组列表中,包括顶点位置.法线.纹理坐标与颜色信息.并且你可以通过索引数组解引用数组元素绘制选定的几何图元. 看看下面的用立即模式绘制立方体的代码. glBegin(GL_TRIANGLES); // draw a cube with 12 triangles // 前面 ================= glVertex3fv(v0); // v0-v1-v2 glVertex3fv(