OpenGL 着色器语言

来源:互联网 发布:水果老虎机算法 编辑:程序博客网 时间:2024/05/22 00:49

前言:此次翻译纯为学习的目的,取4.40版本,为目前最新版本进行翻译。由于专业术语较多,可能有翻译不当之处,遇到不通顺的地方读者自行斟酌



OpenGL着色器语言

语言版本:4.40

文档版本:9

2014-6-16

编辑者:John Kessenich, LunarG

版本1.1作者: John Kessenich, Dave Baldwin, Randi Rost



版权声明忽略


翻译初期先对重点内容进行翻译



1 介绍

        这个文档只针对OpenGL着色器语言4.40. 需要_VERSION_换成440,并且要求#version 只指定为440.如果#version 为比440小的数,代表使用更早版本以及更早版本类型的上下文的着色器语言和OpenGL API。想要获取4.4版本支持哪些版本的语言的更多细节,请参阅OpenGL图形系统说明书(OpenGL Graphics System Specification)


之前版的OpenGL着色器语言,包括OpenGL ES着色器语言,严格来说并不是这个版本的的子集,尤其在 精度,匿名规则,和对待接口的变量方面。若要查看某一版本对应的特性,请参阅相对应的语言版本的详细说明


在这里,所有的OpenGL 图形系统说明都是关于4.4版本的。


1.1感谢

 暂略


1.2 改变

1.21 GLSL 4.40自第8版做的改动

1.22 ...GLSL4.40对应于之前各个更新版本的变动


1.3 概述

此文档描述OpenGL着色器语言4.40版本

用此语言编写的独立编译单元被称作着色器。一段program是一组经过编译和链接在一起,用于代替OpenGL渲染管线中的一个或几个可编程阶段的着色器。单个渲染阶段中的所有着色器必须写在同一个program里。一整套的可编程渲染阶段,可以被放入单个program ,这些渲染阶段也可以被分割到不同的program中。这个文档的目的是对这种编程语言进行详细介绍。OpenGL图形系统说明书将详细说明用于与program、着色器通讯和操作的OpenGL入口


1.4 错误处理

由于不可能侦测到所有的程序错误,通常,编译器是接受错误格式的程序(program)的。只有按照本说明书描述的正确格式的程序(program)才是可移植的(可用的?)

编译器会检测错误格式的程序并给出诊断信息,但是不是所有情况都会。编译期错误返回的一定是着色器的词汇或者语法错误。其他错误会在编译或链接时报告出来。

“挂掉“的代码还是需要使用错误检测的方法进行查明,例如:

if (false) // false变为true时,不可以检测到其他错误(存疑)</span>statement; // 语句必须进行错误检查(存疑)</span>

1.5字体约定

为了增进易读性 斜体字,加粗字体 在前面已经用到过了。代码段,使用固定库看度的字体。文本中的标识符使用斜体字。文本中的关键字使用粗体,暂略


1.6 不建议使用的

OpenGL着色器已经废弃了一些特性。这些被废弃的特性在此说明书中用”不建议“字样指出。它们目前在此版本语言中还存在,但是存在在未来版本的着色器语言中移除的可能性。OpenGL API的向前兼容的特性讲不兼容这些不建议使用的特性。如果使用“不允许使用不建议特性”的模式进行编译,它们的使用将引起编译器或链接期错误。不建议特性是否返回错误模式,请参阅OpenGL图形系统详细说明书。


2 OpenGL着色概述

 OpenGL着色器语言实际上是多种密切相关的语言组成的,这些语言被用作 为OpenGL渲染管线内各个可编程处理器建立着色器。目前,这些处理器是 顶点,细分曲面控制, 细分曲面求值,几何体,片元,和计算处理器。

除非另作说明,在此说明书中一个语言特性在各个语言中都可使用,一般情况下将这些语言当做一种单独的语言来对待。这些特殊的语言将在它们的处理器中被提及:顶点处理器,曲面控制处理器,曲面计算处理器,几何处理器,片元处理器,计算处理器。

大多数的OpenGL状态在着色器中是不可以被检测和使用的。 通常,用户自定义变量将被用于OpenGL渲染管线中各个阶段之间的通讯。然而,有少数的状态还是可以被检测并且在着色器自动可用的,而且有一些内置的变量用作渲染管线中不同阶段之间的接口。


2.1 顶点处理器

顶点处理器是一个对传进来的顶点及其相关信息进行操作的可编程单元。用OpenGL着色器语言写的跑在这个处理器上的编译单元叫做顶点着色器  当一组顶点着色器成功地编译并链接,可以得到一个在顶点处理器中运行的一个可执行顶点着色器

顶点处理器一次只处理一个顶点。它不替代那些一次处理需要知道多多个点的图形操作。

2.2 细分曲面控制处理器 

细分曲面控制器是一个对传进来的一小块顶点及其相关信息进行操作的可编程单元,发送一个新的输出块。用OpenGL着色器写的泡在这个处理器上的编译单元叫做 细分曲面着色器。当一组细分曲面控制着色器成功编译和链接时,它们得到一个跑在细分曲面控制处理器中上的 可执行细分曲面控制着色器

细分曲面控制着色器为输出小块中的每个顶点触发一次调用。每次调用可以读取输入或输出小块中任何一个顶点的属性,但是只能写输出小块中的每个顶点属性。在所有细分曲面控制着色器的调用都完成后,输出的顶点和每个小块的属性组成一个被后面管线阶段使用的小块。

细分曲面控制着色器通常都是独立运行的,并且不会定义触发顺序。然而内置的方法  barrier()可以用作通过同步调用控制触发顺序,将细分曲面控制着色器的触发划分为一系列的阶段。细分曲面控制着色器 在读取同一阶段其他任何一个点的调用所写入数据的 顶点或者小块的属性时,或同一个阶段中的两个调用向同一个小块中写入不同值时 将不会得到结果。

2.3细分曲面求值处理器

细分曲面求值处理器是一个 使用传进来的顶点的小块和这些顶点相关的数据为细分曲面原始生成器生成的一个顶点的位置和其它属性进行求值的可编程单元。用OpenGL着色器写成的在这个处理器上的编译但愿叫做细分曲面求值着色器。当一组细分曲面求值着色器被成功编译和链接,他们产生一个在细分曲面求值处理器中运行的 可执行细分曲面求值着色器。

每个可执行细分曲面求值的调用 会计算由原始细分曲面生成器生成的单个顶点的位置和属性。可执行细分曲面着色器可以读取输入小块的每个顶点的属性,加上被细分后的顶点的相关位置的细分曲面坐标。这个可执行着色器会写入顶点的位置和其他属性。

2.4几何处理器

几何处理器是一个操作进来的经过顶点处理的原始组装过的顶点的数据,并且输出一系列用于组成原始几何体的顶点的可编程单元。

用OpenGL着色器语言写成的在这个处理器上运行的编译单元叫做几何着色器。当一系列及和着色器成功编译并链接,它们得到一个运行在几何处理器上的可执行几何着色器

在几何处理器上的可执行几何着色器的单次调用将作用在一个声明了的输入原始体的固定数量的顶点上。这个单次调用可以发送一个可变数量的被组装进一个被声明的输出原始体类型的原始体的顶点,并传给随后的渲染管线。

2.5片元处理器

片元着色器是一个操作片元值和它们相关数据的可编程单元,用OpenGL着色器语言写成的运行在这个处理器上的编译单元叫做片元着色器,当一组片元着色器成功编译并链接时,它们得到一个运行在片元处理器上的可执行偏远着色器。

一个片元着色器不可以改变一个片元的(x,y)位置。也不允许访问相邻的片元。片元着色器计算出的值, 最终将根据当前引起片元生成的OpenGL状态和OpenGL命令,被用于更新帧缓冲区内存或纹理内存,

2.6计算处理器

计算处理器是一个独立于其他着色处理器的可编程单元。用OpenGL着色器语言写成的,运行在这个处理器上的编译单元,叫做计算着色器。当一组计算着色被成功编译和链接,它们得到一个运行在计算处理器上的可执行计算着色器

一个计算着色器像片元等处理器那样访问很多相同的资源,包括纹理,缓冲区,图像变量和原子计数器, 它没有预定义的输入,也没有固定形式的输出。它不是图像渲染管线的一部分,它作用通过改变图片,存储缓冲区和原子计数器可以窥见一斑。

一个计算着色器作用在一组叫做工作组的工作项上。一个工作组是着色器调对一段相同代码的潜在并行的调用。一个工作组内的调用可以与工作组内成员通过共享的变量和发行内存以及控制与工作组内其它成员同步顺序, 共享数据。


0 0
原创粉丝点击