【GLSL教程】(一)图形流水线

目录

1. 前言

2. 流水线概述

3. 顶点变换(Vertex Transformation)

4. 图元组合和光栅化(Primitive Assembly and Rasterization)

5. 片断纹理化和色彩化(Fragment Texturing and Coloring)

6. 光栅操作(Raster Operations)

7. 一幅图总结固定功能流水线(Visual Summary of the Fixed Functionality)

8. 取代固定的功能(Replacing Fixed Functionality)

9. 顶点处理器

10. 片断处理器


1. 前言

      这是一些列来自 lighthouse3d的GLSL教程,非常适合入门。我将边学习边翻译该教程的内容,同时记录在这里,方便以后查询。

2. 流水线概述

      下图描述了一个简化的图形处理流水线,虽然简略但仍然可以展示着色器编程(shader programming)的一些重要概念。一个固定流水线包括如下功能:

3. 顶点变换(Vertex Transformation)

      这里一个顶点是一个信息集合,包括空间中的位置、顶点的颜色、法线、纹理坐标等。这一阶段的输入是独立的顶点信息,固定功能流水线在这一阶段通常进行如下工作:

  • ·顶点位置变换
  • ·为每个顶点计算光照
  • ·纹理坐标的生成与变换

4. 图元组合和光栅化(Primitive Assembly and Rasterization)

       此阶段的输入是变换后的顶点和连接信息(connectivity information)。连接信息告诉流水线顶点如何组成图元(三角形、四边形等)。此阶段还负责视景体(view frustum)裁剪和背面剔除。

      光栅化决定了片断(fragment),以及图元的像素位置。这里的片断是指一块数据,用来更新帧缓存(frame buffer)中特定位置的一个像素。一个片断除了包含颜色,还有法线和纹理坐标等属性,这些信息用来计算新的像素颜色值。

本阶段的输出包括:

  • ·帧缓存中片断的位置
  • ·在顶点变换阶段计算出的信息对每个片断的插值

这个阶段利用在顶点变换阶段算出的数据,结合连接信息计算出片断的数据。例如,每个顶点包含一个变换后的位置,当它们组成图元时,就可以用来计算图元的片断位置。另一个例子是使用颜色,如果多边形的每个顶点都有自己的颜色值,那么多边形内部片断的颜色值就是各个顶点颜色插值得到的。

5. 片断纹理化和色彩化(Fragment Texturing and Coloring)

此阶段的输入是经过插值的片断信息。在前一阶段已经通过插值计算了纹理坐标和一个颜色值,这个颜色在本阶段可以用来和纹理元素进行组合。此外,这一阶段还可以进行雾化处理。通常最后的输出是片断的颜色值以及深度信息。

6. 光栅操作(Raster Operations)

此阶段的输入:

  • ·像素位置
  • ·片断深度和颜色值

在这个阶段对片断进行一系列的测试,包括:

  • ·剪切测试(scissor test)
  • ·Alpha测试
  • ·模版测试
  • ·深度测试

如果测试成功,则根据当前的混合模式(blend mode)用片断信息来更新像素值。注意混合只能在此阶段进行,因为片断纹理化和颜色化阶段不能访问帧缓存。帧缓存只能在此阶段访问。

7. 一幅图总结固定功能流水线(Visual Summary of the Fixed Functionality)

     下图直观地总结了上述流水线的各个阶段:

8. 取代固定的功能(Replacing Fixed Functionality)

现在的显卡允许程序员自己编程实现上述流水线中的两个阶段:

  • ·顶点shader实现顶点变换阶段的功能
  • ·片断shader替代片断纹理化和色彩化的功能

9. 顶点处理器

      顶点处理器用来运行顶点shader(着色程序)。顶点shader的输入是顶点数据,即位置、颜色、法线等。下面的OpenGL程序发送数据到顶点处理器,每个顶点中包含一个颜色信息和一个位置信息。

glBegin(...);
    glColor3f(0.2,0.4,0.6);
    glVertex3f(-1.0,1.0,2.0);
    glColor3f(0.2,0.4,0.8);
    glVertex3f(1.0,-1.0,2.0);
glEnd();

 一个顶点shader可以编写代码实现如下功能:

  • ·使用模型视图矩阵以及投影矩阵进行顶点变换。
  • ·法线变换及归一化。
  • ·纹理坐标生成和变换。
  • ·逐顶点或逐像素光照计算。
  • ·颜色计算。

不一定要完成上面的所有操作,例如你的程序可能不使用光照。但是,一旦你使用了顶点shader,顶点处理器的所有固定功能都将被替换。所以你不能只编写法线变换的shader而指望固定功能帮你完成纹理坐标生成。

从上一节已经知道,顶点处理器并不知道连接信息,因此这里不能执行拓扑信息有关的操作。比如顶点处理器不能进行背面剔除,它只是操作顶点而不是面。

顶点shader至少需要一个变量:gl_Position,通常要用模型视图矩阵以及投影矩阵进行变换。顶点处理器可以访问OpenGL状态,所以可以用来处理材质和光照。最新的设备还可以访问纹理。

10. 片断处理器

片断处理器可以运行片断shader,这个单元可以进行如下操作:

  • ·逐像素计算颜色和纹理坐标。
  • ·应用纹理。
  • ·雾化计算。
  • ·如果需要逐像素光照,可以用来计算法线。

片断处理器的输入是顶点坐标、颜色、法线等计算插值得到的结果。在顶点shader中对每个顶点的属性值进行了计算,现在将对图元中的每个片断进行处理,因此需要插值的结果。

如同顶点处理器一样,当你编写片断shader后,所有固定功能将被取代,所以不能使用片断shader对片断材质化,同时用固定功能进行雾化。程序员必须编写程序实现需要的所有效果。

片断处理器只对每个片断独立进行操作,并不知道相邻片断的内容。类似顶点shader,我们必须访问OpenGL状态,才可能知道应用程序中设置的雾颜色等内容。

一个片断shader有两种输出:

  • ·抛弃片断内容,什么也不输出
  • ·计算片断的最终颜色gl_FragColor,当要渲染到多个目标时计算gl_FragData。

还可以写入深度信息,但上一阶段已经算过了,所以没有必要。

需要强调的是片断shader不能访问帧缓存,所以混合(blend)这样的操作只能发生在这之后。

本文转自:【GLSL教程】(一)图形流水线_glsl 连接线_racehorse的博客-CSDN博客 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GLSL是一种高级着色语言,用于编写OpenGL着色器。其中,片源着色器是其中的一种。在GLSL中,一个片元代表一个像素,片元着色器会在每个像素处运行一次,计算出对应像素的最终颜色。 这篇GLSL片源着色器教程将会介绍一些基本的概念和操作,包括数据类型、变量、控制流语句、函数和一些常用的函数库。 在编写GLSL片源着色器时,我们需要定义一些输入和输出变量,以便与其他部分的着色器和应用程序进行通信,在片源着色器中主要是传入顶点数据,其中包括顶点的位置、法线、纹理坐标等。我们还可以声明一些中间变量和输出变量用于存储过程中计算出的结果,这些变量是片源着色器中非常重要的概念。 在GLSL片源着色器中,我们可以使用控制流语句来进行条件判断和循环,这些语句类似于其他编程语言中的语句,包括if/else、for、while等。 GLSL着色语言提供了许多内置函数和库,来进行常用的计算、采样、光照和常见效果的计算等。在编写片源着色器时,使用这些函数和库可以显著地简化代码,加速处理速度。 总之,GLSL片源着色器是OpenGL实现高效渲染的关键部分。熟练掌握GLSL片源着色器的编写技巧,可以帮助我们编写高效的渲染引擎和处理器。 ### 回答2: GLSL是OpenGL着色器语言的标准,它用于编写图形渲染的着色器程序。其中的一种着色器就是片源着色器。片源着色器是在像素级别对图形的颜色进行处理的程序。GLSL片源着色器的编写其实非常简单,只需要使用一些基本的语言结构,就可以进行像素级别的颜色处理了。 首先,我们要定义变量。GLSL是强类型编程语言,所以要先定义需要用到的变量。可以定义各种类型的变量,比如int、float、vec2、vec3等。 其次,我们要获取图形的当前像素坐标和颜色。片源着色器可以访问当前像素的坐标和颜色信息。这两个变量可以通过gl_FragCoord和gl_FragColor来获取。 然后,我们可以对颜色进行各种处理。GLSL提供了各种内置函数,可以对颜色进行处理复杂的运算。我们也可以自定义一些函数来进行更加复杂的颜色操作。 最后,我们可以将处理后的颜色写入到渲染缓冲区中。这个可以通过gl_FragColor来实现。 总之,GLSL片源着色器的编写非常简单,只需要掌握一些基本的语言结构就可以了。要实现复杂的效果,可以结合使用各种运算和内置函数。通过灵活使用GLSL片源着色器,可以实现各种炫酷的图形渲染效果。 ### 回答3: GLSL是OpenGL着色语言的缩写,它是一种高级着色器语言。在OpenGL中,着色器被用于渲染物体和场景。 GLSL着色器分为两种类型,分别是顶点着色器和片源着色器。其中,片源着色器用于计算每个像素的颜色值。 GLSL片源着色器教程的目的是为了帮助开发者了解如何创建自己的着色器程序。在GLSL中,着色器程序由一系列指令组成,这些指令被称为着色器代码。 首先,我们需要创建一个基本的片源着色器程序。在GLSL中,片源着色器程序由以下几个部分组成:输入,输出和主程序。 输入部分定义了着色器需要接收的数据类型,包括颜色,法线向量等。输出部分定义了着色器程序需要返回的颜色值。主程序部分包括了对输入数据的处理和计算步骤。 在GLSL中,像素颜色值是通过处理输入数据得出的,具体的颜色计算过程可以在主程序中实现。通过这种方式,开发者可以利用GLSL着色器来创建各种不同的效果和渲染方式。 总之,如果你想学习GLSL片源着色器编程,你需要了解着色器程序的基本结构和语法,掌握各种自定义函数和变量,以及学会在主程序中进行高级计算和渲染操作。这些技能将有助于你创建出最佳的渲染效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值