c++ opengl 三维图形中显示文字_opengl基本流程
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渲染的最后一个流程,它的主要作用就是赋予我们图形最终的颜色,纹理渲染也在这个阶段,这里要跟顶点着色器区别一下,顶点着色器只是得到纹理坐标,最终还是要传递到片元着色器,用具体的纹理(如一张图片)来渲染。
还有颜色要注意一下,我们可以看到顶点着色器可以每个顶点赋予一个颜色值,那么当传递到片元着色器,如果片元着色器不做其他处理,那么片元将会自动根据顶点颜色进行插值;
- //片元着色器
- in vec4 Color;//顶点着色器传递过来的每个顶点的颜色
- void main
- {
- FragColor = Color;
- }
opengl渲染的大概流程就是这样,因为平时工作中用到opengl并不是很多,更多是用基于opengl的高级引擎,即使用到opengl一般也大多用它的固定管线模式,因此可能出现错误,请多多指正。
c++ opengl 三维图形中显示文字_opengl基本流程相关推荐
- c++ opengl 三维图形中显示文字_为什么使用GPU渲染图形图像,而不使用CPU呢?
引言 作为程序员,我们或多或少知道可视化应用程序都是由 CPU 和 GPU 协作执行的.那么我们就先来了解一下两者的基本概念: CPU(Central Processing Unit):现代计算机的三 ...
- c++ opengl 三维图形中显示文字_3D图形 和 OpenGL 简介
一.走向3D 三维(3D)表示一个正在描述或显示的物体具有3个维度:宽度.高度和深度.例如,放在书桌上的一张画是一个二维物体,因为它没有可以令人感受得到的深度.而旁边的药瓶却能感受到它是3D,因为它具 ...
- OpenGL三维图形编程技术(转)
人们对三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(Graphics Library)三维图形库表现尤为突出,它易于使用且功能强大.随着计算机技 ...
- OpenGL三维图形编程技术【转】
一.OpenGL 的发展历史 人们对三维图形技术的研究已经经历了一个很长的历程,而且涌现了许多三维图形开发工具,其中SGI公司推出的GL(Graphics Library)三维图形库表现尤为突出,它易 ...
- 计算机图形学 8.5 三维图形的显示流程图
8.5 三维图形的显示流程图 显示流程图 观察变换 从世界坐标系到观察坐标系的变换 模型变换 模型坐标系 Modeling Coordinate 物体的局部坐标系 在模型坐标系 ...
- 03-07 创建和编辑AutoCAD实体(七) 向图形中添加文字(1)使用文字样式
Add Text to Drawings向图形中添加文字 Text conveys important information in yourdrawing. Use text objects for ...
- python画图显示中文乱码_解决Python pandas plot输出图形中显示中文乱码问题
解决方式一: import matplotlib #1. 获取matplotlibrc文件所在路径 matplotlib.matplotlib_fname() #Out[3]: u'd:\\Anaco ...
- python图片显示中文_解决Python pandas plot输出图形中显示中文乱码问题
解决方式一: import matplotlib #1. 获取matplotlibrc文件所在路径 matplotlib.matplotlib_fname() #Out[3]: u'd:\\Anaco ...
- 如何在matlab里输入复杂公式_[转载]如何在Matlab绘制的图形中显示复杂公式
Matlab文本的Interpreter属性使我们能在图形中显示一个较为复杂的公式,例如在公式中除了有希腊字母外,还有分号.根号等数学符号. 当键入:>> set(text,'Interp ...
- SketchUp:解决三维图中显示交点粗的现象图文教程
SketchUp:解决三维图中显示交点粗的现象图文教程 目录 解决问题 解决方法 解决问题 三维图中显示交点粗的现象 解决方法
最新文章
- Widget上实时刷新图片,造成anr问题
- 【SQLite】简单的基本使用步骤
- 图片动画横条广告带上下滚动
- python剑指offer替换空格_《剑指Offer》字符串 替换空格
- 杭电 看归并排序和快速排序
- 讲python现状的文章_用 Python 分析 Python 工作现状
- 前端开发学java_Java前端开发需要学习什么
- 对文件夹中文件进行批量重命名
- 一行代码统计文本中指定字符串出现的次数
- 多重if-else的精简方式
- cαr怎么发音_【英语拼读发音规则】连读、略读、重读、断句、语调……
- ospf 指定dr_OSPF DR BDR 配置方法2
- MATLAB在安装时需要选择安装的产品
- dev c 扫雷程序代码c语言,C语言 扫雷程序的实现
- 手机屏幕技术浅述(TFT、SLCD、AMOLED、NOVA、IPS、ASV)
- HTML 图片鼠标悬停动态效果
- ROS学习——Ubuntu 安装软件报错问题(关于进程锁)
- 小米电池温度测试软件,MIUI12怎么看电池温度 小米手机电池损耗寿命查看方法...
- [深度学习论文笔记]Multi-phase Liver Tumor Segmentation with Spatial Aggregation
- React中,通过iframe,实现文件下载功能
热门文章
- SLAM_ORB-SLAM3(VIO/IMU)适配KITTI数据集,并评估!!!奶妈级教程!!!
- 钉钉自定义机器人 发送文本 换行 \n无效果
- 区块链学习笔记(二)
- Android初学第9天
- (转)JVM——内存管理和垃圾回收
- Android PopupWindow Dialog 关于 is your activity running 崩溃详解
- 吸毒女5次搬家躲粉友:想给女儿干净环境
- 【OpenCV学习笔记】【编程实例】三(将一个图像中的指定区域拷贝到另一个图像的指定区域
- 【Matlab学习笔记】【编程实例】一(将两幅图像调整为相同的尺寸大小)
- 【pymongodb】去除重复记录