✯GLSL-2-着色器概述
Posted itzyjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了✯GLSL-2-着色器概述相关的知识,希望对你有一定的参考价值。
目录
大多数API状态都不会被跟踪或提供给着色器。通常,用户定义的变量将用于API管道不同阶段之间的通信。然而,仍有少量状态被跟踪并自动提供给着色器,并且API管道不同阶段之间的接口有一些内置变量。
1.顶点处理器(Vertex Processor)
顶点处理器是一个可编程单元,对传入顶点及其相关数据进行操作。用OpenGL着色语言编写并在该处理器上运行的编译单元称为顶点着色器(vertex shaders)。成功编译并链接一组顶点着色器后,它们将生成顶点处理器上运行的顶点着色器可执行文件。
顶点处理器一次处理一个顶点。它不会取代一次需要了解多个顶点的图形操作。
2.细分控制处理器(Tessellation Control Processor)
细分控制处理器是一个可编程单元,它对输入顶点及其相关数据的面片(patch)
进行操作,并发出新的输出面片。用OpenGL着色语言编写并在该处理器上运行的编译单元称为细分控制着色器(tessellation control shaders)。成功编译并链接一组细分控制着色器后,它们将生成在细分控制处理器上运行的细分控制着色器可执行文件。
将为输出面片的每个顶点调用细分控制着色器。每次调用都可以读取输入或输出面片中任何顶点的属性,但只能写入相应输出面片顶点的逐顶点属性(per-vertex attributes)。着色器调用为输出面片共同生成一组逐面片属性(per-patch attributes)。
在所有细分控制着色器调用完成后,输出顶点和逐面片属性将被组合,以形成一个面片,供后续管道阶段使用。
细分控制着色器调用主要独立运行,相对执行顺序未定义。但是,内置函数*barrier()*可以通过同步调用来控制执行顺序,从而有效地将细分控制着色器执行划分为一组阶段。如果一个调用在同一阶段的任何时间点读取另一个调用写入的逐顶点或逐面片属性,或者如果两个调用试图在单个阶段向同一个逐面片输出32位组件(32-bit component)写入不同的值,细分控制着色器将获得未定义的结果。
3.细分评估处理器(Tessellation Evaluation Processor)
细分评估处理器是一个可编程单元,它使用传入顶点的面片及其相关数据,评估由细分图元
生成器(tessellation primitive
generator)生成的顶点的位置和其他属性。用OpenGL着色语言编写并在该处理器上运行的编译单元称为细分评估着色器(tessellation evaluation shaders)。成功编译并链接一组细分评估着色器后,它们将生成在细分评估处理器上运行的细分评估着色器可执行文件。
每次调用细分评估可执行文件都会计算由细分图元生成器生成的单个顶点的位置和属性。可执行文件可以读取输入面片中任何顶点的属性,以及细分坐标,该坐标是要细分的图元中顶点的相对位置。可执行文件写入顶点的位置和其他属性。
4.几何处理器(Geometry Processor)
几何处理器是一个可编程单元,它对顶点处理后组装的图元的传入顶点数据进行操作,并输出形成输出图元的顶点序列。用OpenGL着色语言编写并在该处理器上运行的编译单元称为几何着色器(geometry shaders)。成功编译和链接一组几何着色器后,它们将生成在几何处理器上运行的几何着色器可执行文件。
对几何处理器上的几何着色器可执行文件的单个调用将对具有固定顶点数的已声明输入图元(a declared input primitive)进行操作。这个单一调用可以发出(emit)数量可变的顶点,这些顶点被组装成已声明的输出图元类型的图元(primitives of a declared output primitive type),并传递给后续的管道阶段。
5.片段处理器(Fragment Processor)
片段处理器是一个可编程单元,对片段(fragment)
值及其相关数据进行操作。用OpenGL着色语言编写并在该处理器上运行的编译单元称为片段着色器(fragment shaders)。当一组片段着色器成功编译和链接时,它们会生成一个在片段处理器上运行的片段着色器可执行文件。
片段着色器无法更改片段的(x, y)位置。不允许访问相邻的片段。片段着色器计算的值最终用于更新帧缓冲区内存或纹理内存,具体取决于当前API状态和导致生成片段的API命令。
6.计算处理器(Compute Processor)
计算处理器是一个可编程单元,独立于其他着色器处理器运行。用OpenGL着色语言编写并在该处理器上运行的编译单元称为计算着色器(compute shaders)。当一组计算着色器成功编译和链接时,它们会生成一个在计算处理器上运行的计算着色器可执行文件。
计算着色器可以访问与片段和其他着色器处理器相同的许多资源,例如纹理、缓冲区、图像变量(image variables)和原子计数器(atomic counters)。它没有固定的功能输出。它不是图形管道的一部分,其可见的副作用是通过更改图像、存储缓冲区和原子计数器。
计算着色器对一组称为工作组(workgroup)的工作项(work items)进行操作。工作组是一组着色器调用,它们可能并行执行相同的代码。工作组内的调用可以通过共享变量与同一工作组的其他成员共享数据,并发出内存和控制流屏障(issue memory and control flow barriers),以与同一工作组的其他成员同步。
补充说明
面片(patch):最基本的面片(也叫“补丁”)是平面三角形区域,我们通常说的面片也就是三角形面片。(如果一个多边形在同一平面,则多边形区域也是一个面片。)
图元(primitive):OpenGL认为,所有物体都是由点、线、多边形构成的;点、线、多边形就被称为图元。
OpenGL一共定义了10种图元:
片段(fragment):二维图象上每个像素点都包含了位置、颜色、深度等信息;该点和相关信息一起就叫做一个片段(也叫“片元”)。片段和像素两者的直观印象都是像素,但片段比像素多了许多信息。
以上是关于✯GLSL-2-着色器概述的主要内容,如果未能解决你的问题,请参考以下文章
Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形
我的OpenGL学习进阶之旅如何抽取着色器代码到assets目录下的GLSL文件,以及如何通过Java或者C++代码来加载着GLSL文件?