OpenGL 各个shader的作用和区别

2023-11-09

OpenGL4.0发布了Tessellation shader(Control + Evaluation shader)。到OpenGL4.* 为止,现在OpenGL已经支持了5种不同类型的shader。

1.Vertex Shader,简称VS

2.TESS  Control  Shader (D3D11 叫Hull shader),简称TCS

3.TESS Evaluation Shader (D3D叫Domain shader),简称TES

4.Geometry Shader ,简称GS

5.Fragment Shader(D3D叫Pixel Shader),简称PS


我将根据他们的“主要”输入与输出,以及其基本功能进行对比。这样我们就可以很好的了解他们在OpenGL Pipeline里面的作用和区别。

以下顺序是他们在OpenGL Pipeline里面的执行顺序。


1.Vertex Shader

输入:顶点坐标(Position),该坐标值是由glVertex* 或者是glDraw*传入的。

输出:顶点坐标,这个是经过几何变换后的坐标。

功能简单的说就是把输入的顶点坐标乘以(一系列)几何变换矩阵。每输入一个顶点(也就是glVertex*每调用一次),Vertex shader都会被调用一次。Vertex Shader只知道处理顶点,它不知道这些顶点是做什么用的,也就是不知道这些顶点将来会被装配成什么图元。(因为Vertex shader后面才会有图元装配的过程)

当然,VS还可以接收颜色,纹理坐标,雾坐标等属性,并在内部对他们做一点点变化,然后再输出。


2.TESS Control Shader

输入:Patch,一个Patch可以看成是多个顶点的集合。它包括每个顶点的属性(坐标,颜色,纹理坐标等等)。用户可以指定一个patch里面要包含几个顶点。同时,一个patch还可以用自己的属性,该属性被它内部的所有顶点共有,即这些顶点只有一套patch属性,而不是每个顶点拥有一个自己的patch属性。(懂了吗?)

输出:Patch , gl_TessLevelOuter , gl_TessLevelInner。

功能:TCS会根据需求把Patch自己的属性以及它内部的顶点属性做一些修改。然后输出Patch。当然,它也可以不做任何修改,直接传给后面的shader。我们知道Tessellation的作用就是把一个图元分割成很多图元,比如把一个三角形分割成很多更小的三角形。因此,在分割的时候我们得要知道这个三角形的每个边要被分割成多少段,然后在三角形内部,我们还要怎么继续分割,这两个紫色的内容就是存储在 gl_TessLevelOuter 和gl_TessLevelInner。TCS可以根据需要设置这两个值。

所以,TCS的主要作用是设置Patch以及它内部顶点的属性。同时也是最重要的,设置图元接下来被细分的。(TCS不做分割动作)

下面贴了个三角形分割的图片。


注意:用TCS的话,glBegin函数的参数必须是GL_PATCHES,而不是以前那种传统的图元(点,线,三角形等)。 glPatchParameteri可以指定每个Patch包含几个顶点。在VS与TCS直接有个图元装配的过程,它就是把VS输出的顶点封装一个Patch,然后传给TCS。


3.TESS Evaluation Shader

输入:一系列顶点。这些顶点是三角形被分割后产生的顶点。下面是每个TES程序都必须有的一段代码:

layout( triangles, fractional_odd_spacing, ccw ) in;

它表示TES的输入是三角形(当然你也可以写成其他类型的图元),至于 fractional_odd_spacing,和ccw是什么意思,大家看spec吧,很简单,我怕我解释不清楚而误解大家。最后的那个“in”进一步说明了这是TES的输入。

输出:也是一系列顶点。

功能:其实在TCS与TES之间有个过程叫Tessellation Primitive Generator(简称TGP),它首先会去查看TES的输入是什么,哦,它要三角形。那么,TGP就会把TCS传入的Patch内部的顶点看成是若干个三角形(注意Patch内部的顶点不一定只有三个)。然后,TGP每次从当前Patch里面取出三个顶点做一个三角形的分割,直到Patch里面的顶点全部被取出。

每个三角形具体怎么被分割呢?

其实,gl_TessLevelOuter 和gl_TessLevelInner会被传入给TGP。它们的作用就被体现出来。这就是为什么我前面说的TCS不做分割,只计算分割的度。(注意TGP不是shader,它只是pipeline里面的一个状态而已)

现在开始讲TES的功能吧。其实TGP传入的顶点的坐标值并不是世界坐标值,而是一个三角形内部的坐标表示形式,大家看到上面的图了吧,三角形顶点上有坐标的,TGP然后根据这个坐标去计算内部新成立的顶点在该局部坐标系内部的坐标。因此,TES就是要把每个顶点的局部坐标变换成世界坐标,以及把顶点相应属性(颜色,纹理坐标等)转换成真正且有效的属性值。每处理一个顶点就输出一个顶点。

注意:TES并不知道这些顶点会被组成什么图元,它只要求TGP把patch内部的顶点当成什么图元去分割。TES和VS一样,输入是顶点,输出也是顶点。在TES后面有个图元装配的过程,它会根据TES的输入(看上面的那行代码),转换成相应的图元。这里图元装配器会把TES输出的顶点装配成一个一个的三角形。


4.Geometry Shader

输入:一个图元

输出:一个或者多个图元

功能:无论是否有VS,TCS或者TES,在GS前面都会有一个图元装配的过程,也就是说,传给GS的是图元,而不是顶点。

GS可以做什么呢?

根据新图元生成新一个或者多个图元。下面两会代码也是每个GS都必须有的:

layout( triangles ) in;
layout( triangle_strip, max_vertices = 3 ) out;

它表示GS输入的图元是三角形。如果当前图元不是三角形,该GS将不会被调用。该GS的输出是三角形带,每个三角形带最多包括三个顶点。其实这个GS的输入和输出可以看成是一样,没做太多的事情。呵呵。如果最大顶点数超过3,那么GS实际上是把多个三角形拼成了一个三角形带。具体怎么,根据需要自己去写程序吧。

具体GS能够做什么呢?

举个简单的例子吧。我们可以用GS画Bezier曲线。Bezier曲线是有几个控制点生成的,我们可以把这些控制点假装当成图元(点,线,线带)传个GS。然后GS在内部通过Bezier曲线算法算出跟多的Bezier曲线上面的顶点。算出来的点当成线带输出,这样就由控制点计算出了新图元(Bezier曲线)。懂了吗?

这里有很多GS的例子:http://blog.csdn.net/jackers679/article/details/7472317


下班了,下次写FS。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 各个shader的作用和区别 的相关文章

随机推荐

  • Python安装教程(2023年,3月)

    一 Python下载 1 进入Python官网 官网地址 https www python org 2 点击 Downloads 展开后点击 Windows 跳转到下载python版本页面 选择 Stable Releases 稳定版本 我
  • [gfirefly深入解析]--总体架构及demo讲解

    gfirefly是开源的分布式游戏服务器端框架 是firefly的gevent版本 想了解更多关于firefly可参考http www oschina net question 947559 147468 这是firefly的官网http
  • 【读书笔记】《Web全栈工程师的自我修养》

    读书笔记 Web全栈工程师的自我修养 推荐书单 1 什么是全栈工程师 黑客与画家 专业主义 2 如何成为全栈工程师 重来 更为简单有效的商业思维 精益创业 3 从学生到工程师 编程之美 微软技术面试心得 4 野生程序员的故事 打造Faceb
  • TOP命令及参数解析

    Top命令是linux 下常用的系统性能分析工具 能够实时显示系统中各个进程的资源占用状况 类似于windows的任务管理器 下面详细介绍它的使用方法 top 可以显示当前系统正在执行的进程的相关信息 包括进程ID 内存占用率 CPU占用率
  • 机器学习-分类-线性分类器

    在一个机器学习任务中 如果每一条数据的目标值是离散的 则该任务是一个分类任务 解决分类问题基本的方法有 线性分类器 决策树 朴素贝叶斯 人工神经网络 K近邻 KNN 支持向量机 SVM 组合基本分类器的集成学习算法 随机森林 Adaboos
  • java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...

    float和double类型的数据在编程时的需要注意的地方 package execisetest public class AccuranceTest public static void main String args float a
  • Rsync命令使用

    Rsync优点 持增量备份 第 次全量备份 第 次增量备份 边复制 边 较 边统计 传输效率很 数据集中备份 客户端可以推送数据 服务端 也可以从服务端获取数据 以客户端为参照物 保持 件属性 符号链接 硬链接 权限 时间等 安全 式传输
  • 微信企业号回调模式配置详细讲解

    对于微信企业号 我相信很多人都不陌生了 今天跟大家一起来探讨一下用java怎么去实现微信企业号回调模式配置 为什么需要开启回调模式 对于这点 我相信官方文档中说得比我更清楚 但是我还是想大家熟悉一下什么是回调模式 说白了就是当你有一个属于自
  • mysql in 查询时 入参为逗号隔开的字符如何查询,使用 find_in_set 代替 in

    SELECT FROM lao car model where find in set id 101 102 41840930066432 find in set 函数中 id 查询的字段名
  • 传统支付方式不能满足线下支付的需求

    刷脸支付趋势现在可以在便利店 餐饮店看见这样的场合 收银台不见了 换成了一块类似平板大小的显示屏 上边标注了刷脸支付 消费者在屏幕上点击开启刷脸支付 将脸部对准摄像头 摄像头采集到消费者面部信息后即可完成支付 消费金额就直接从消费者账户中扣
  • epoll实现原理

    用户态协议栈 为什么要实现epoll epoll并不是协议栈里面的 为什么要实现用户态协议栈 因为内核的epoll是对内核文件系统vfs fd进行的管理 是跟内核协议栈一起使用的 内核协议栈处理io后通过回调的方式来操作epoll中的就绪队
  • 两台计算机直连通信过程,教大家两台电脑网线直连传输的技巧

    我们总有需要把一台电脑的资料传输到另一台电脑的时候 其实我们可以让两台电脑共享局域网 通过网线直连来达到传输的目的 下面来看看小编是怎么操作的吧 1 设置电脑IP 首先打开下图界面 点击本地连接 2 接着我们点击属性选项 3 点击下图选中的
  • 零基础前端Vue的小白学习路——(Node.js,VSCODE,Hbuilder X)环境搭建

    俗话说 实践是检验真理的唯一标准 IT的学习更是离不开实践 要想成绩好 一个 做题笔记本 少不了 搭建环境想必是许多IT人刚入门一个新语言的第一个门槛 不正确的配置 不适配的版本往往会让你未来的道路变得不平坦 因此搭建环境时需要尤为谨慎 好
  • AVL代码 java

    任意一个节点 左右字数的高度差不能为超过1 先对x左旋转 转化为LL import java util ArrayList public class AVLTree
  • Java-静态绑定和动态绑定

    Java 静态绑定和动态绑定 绑定的概念 静态绑定 动态绑定 举例 绑定的概念 绑定指的是一个方法的调用与方法所在的类 方法主体 关联起来 对java来说 绑定分为静态绑定和动态绑定 或者叫做前期绑定和后期绑定 静态绑定 概念 在程序执行前
  • 字符编码与C++

    背景 C 的项目 字符编码是一个大坑 不同平台之间的编码往往不一样 如果不同编码格式用一套字符读取格式读取就会出现乱码 所以本文旨在对字符编码的知识做一个大概的梳理 字符编码定义 计算机是以二进制的形式来存储数据的 它只认识 0 和 1 两
  • angular2配置反向代理

    解决angualr2跨域问题 项目根目录下创建proxy conf json文件夹 api target http 106 75 29 87 8182 pathRewrite api environment gt environment t
  • 1093 - You can‘t specify target table ‘api‘ for update in FROM clause

    1093 You can t specify target table api for update in FROM clause 翻译 白话 例 修改 解决 翻译 您不能在 FROM 子句中指定目标表 Table 进行更新 白话 你不能先
  • @PreAuthorize注解详解

    PreAuthorize注解会在方法执行前进行权限验证 支持Spring EL表达式 它是基于方法注解的权限解决方案 只有当 EnableGlobalMethodSecurity prePostEnabled true 的时候 PreAut
  • OpenGL 各个shader的作用和区别

    OpenGL4 0发布了Tessellation shader Control Evaluation shader 到OpenGL4 为止 现在OpenGL已经支持了5种不同类型的shader 1 Vertex Shader 简称VS 2