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

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

通过三个矩阵,模型视图矩阵,投影矩阵,视口矩阵直接转换到屏幕坐标。

通过模型视图矩阵转换到-1到1的单位立方体,然后进行剪裁和光照计算,再通过视图矩阵转换成屏幕坐标。

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

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

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

抖动,雾效,再经过剪裁测试,A测试,模版测试,深度测试。

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

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

  1. //片元着色器
  2. in vec4 Color;//顶点着色器传递过来的每个顶点的颜色
  3. void main
  4. {
  5. FragColor = Color;
  6. }

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

c++ opengl 三维图形中显示文字_opengl基本流程相关推荐

  1. c++ opengl 三维图形中显示文字_为什么使用GPU渲染图形图像,而不使用CPU呢?

    引言 作为程序员,我们或多或少知道可视化应用程序都是由 CPU 和 GPU 协作执行的.那么我们就先来了解一下两者的基本概念: CPU(Central Processing Unit):现代计算机的三 ...

  2. c++ opengl 三维图形中显示文字_3D图形 和 OpenGL 简介

    一.走向3D 三维(3D)表示一个正在描述或显示的物体具有3个维度:宽度.高度和深度.例如,放在书桌上的一张画是一个二维物体,因为它没有可以令人感受得到的深度.而旁边的药瓶却能感受到它是3D,因为它具 ...

  3. OpenGL三维图形编程技术(转)

    人们对三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(Graphics Library)三维图形库表现尤为突出,它易于使用且功能强大.随着计算机技 ...

  4. OpenGL三维图形编程技术【转】

    一.OpenGL 的发展历史 人们对三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(Graphics Library)三维图形库表现尤为突出,它易 ...

  5. 计算机图形学 8.5 三维图形的显示流程图

    8.5 三维图形的显示流程图 显示流程图 观察变换 从世界坐标系到观察坐标系的变换 模型变换 模型坐标系     Modeling Coordinate     物体的局部坐标系     在模型坐标系 ...

  6. 03-07 创建和编辑AutoCAD实体(七) 向图形中添加文字(1)使用文字样式

    Add Text to Drawings向图形中添加文字 Text conveys important information in yourdrawing. Use text objects for ...

  7. python画图显示中文乱码_解决Python pandas plot输出图形中显示中文乱码问题

    解决方式一: import matplotlib #1. 获取matplotlibrc文件所在路径 matplotlib.matplotlib_fname() #Out[3]: u'd:\\Anaco ...

  8. python图片显示中文_解决Python pandas plot输出图形中显示中文乱码问题

    解决方式一: import matplotlib #1. 获取matplotlibrc文件所在路径 matplotlib.matplotlib_fname() #Out[3]: u'd:\\Anaco ...

  9. 如何在matlab里输入复杂公式_[转载]如何在Matlab绘制的图形中显示复杂公式

    Matlab文本的Interpreter属性使我们能在图形中显示一个较为复杂的公式,例如在公式中除了有希腊字母外,还有分号.根号等数学符号. 当键入:>> set(text,'Interp ...

  10. SketchUp:解决三维图中显示交点粗的现象图文教程

    SketchUp:解决三维图中显示交点粗的现象图文教程 目录 解决问题 解决方法 解决问题 三维图中显示交点粗的现象 解决方法

最新文章

  1. Widget上实时刷新图片,造成anr问题
  2. 【SQLite】简单的基本使用步骤
  3. 图片动画横条广告带上下滚动
  4. python剑指offer替换空格_《剑指Offer》字符串 替换空格
  5. 杭电 看归并排序和快速排序
  6. 讲python现状的文章_用 Python 分析 Python 工作现状
  7. 前端开发学java_Java前端开发需要学习什么
  8. 对文件夹中文件进行批量重命名
  9. 一行代码统计文本中指定字符串出现的次数
  10. 多重if-else的精简方式
  11. cαr怎么发音_【英语拼读发音规则】连读、略读、重读、断句、语调……
  12. ospf 指定dr_OSPF DR BDR 配置方法2
  13. MATLAB在安装时需要选择安装的产品
  14. dev c 扫雷程序代码c语言,C语言 扫雷程序的实现
  15. 手机屏幕技术浅述(TFT、SLCD、AMOLED、NOVA、IPS、ASV)
  16. HTML 图片鼠标悬停动态效果
  17. ROS学习——Ubuntu 安装软件报错问题(关于进程锁)
  18. 小米电池温度测试软件,MIUI12怎么看电池温度 小米手机电池损耗寿命查看方法...
  19. [深度学习论文笔记]Multi-phase Liver Tumor Segmentation with Spatial Aggregation
  20. React中,通过iframe,实现文件下载功能

热门文章

  1. SLAM_ORB-SLAM3(VIO/IMU)适配KITTI数据集,并评估!!!奶妈级教程!!!
  2. 钉钉自定义机器人 发送文本 换行 \n无效果
  3. 区块链学习笔记(二)
  4. Android初学第9天
  5. (转)JVM——内存管理和垃圾回收
  6. Android PopupWindow Dialog 关于 is your activity running 崩溃详解
  7. 吸毒女5次搬家躲粉友:想给女儿干净环境
  8. 【OpenCV学习笔记】【编程实例】三(将一个图像中的指定区域拷贝到另一个图像的指定区域
  9. 【Matlab学习笔记】【编程实例】一(将两幅图像调整为相同的尺寸大小)
  10. 【pymongodb】去除重复记录