Direct3D 11 Tutorial 3: Shaders and Effect System_Direct3D 11 教程3:着色器和效果系统

概述

在上一个教程中,我们设置了一个顶点缓冲区并将一个三角形传递给GPU。 现在,我们将逐步完成图形管道并查看每个阶段的工作原理。 将解释着色器和效果系统的概念。

请注意,本教程与前一个源代码共享相同的源代码,但将强调不同的部分。

资源目录

(SDK root)\Samples\C++\Direct3D11\Tutorials\Tutorial03

Github仓库

图形管道

在上一个教程中,我们设置顶点缓冲区,然后将顶点布局与顶点着色器相关联。 现在,我们将解释着色器是什么以及它是如何工作的。 为了完全理解各个着色器,我们将退后一步,查看整个图形管道。

在教程2中,当我们调用VSSetShader()和PSSetShader()时,我们实际上将着色器绑定到管道中的一个阶段。 然后,当我们调用Draw时,我们开始处理传递到图形管道的顶点数据。 以下部分详细描述了Draw命令之后发生的情况。

着色器

在Direct3D 11中,着色器位于图形管道的不同阶段。它们是由GPU执行的短程序,它接收某些输入数据,处理该数据,然后将结果输出到管道的下一阶段。 Direct3D 11支持三种基本类型的着色器:顶点着色器,几何着色器和像素着色器。顶点着色器将顶点作为输入。对于通过顶点缓冲区传递给GPU的每个顶点,它运行一次。几何着色器将基元作为输入,并对传递给GPU的每个基元运行一次。基元是点,线或三角形。像素着色器将像素(或有时称为片段)作为输入,并且对于我们希望渲染的图元的每个像素运行一次。顶点,几何和像素着色器一起是动作的主要部分。使用Direct3D 11渲染时,GPU必须具有有效的顶点着色器和像素着色器。几何着色器是Direct3D 11中的高级功能,是可选的,因此我们不会在本教程中讨论几何着色器。在Direct3D 11中,还有用于细分的外壳和域着色器以及用于计算的计算着色器。有关这些的更多信息,请参阅其他示例。

顶点着色器

顶点着色器是GPU在顶点上执行的短程序。 将顶点着色器视为C函数,将每个顶点作为输入,处理输入,然后输出修改后的顶点。 应用程序以顶点缓冲区的形式将顶点数据传递给GPU后,GPU遍历顶点缓冲区中的顶点,并为每个顶点执行一次活动顶点着色器,将顶点数据作为输入参数传递给顶点着色器。

虽然顶点着色器可用于执行许多任务,但顶点着色器最重要的工作是变换。 转换是将矢量从一个坐标系转换为另一个坐标系的过程。 例如,3D场景中的三角形可以使其顶点位于(0,0,0)(1,0,0)(0,1,0)的位置。 当在2D纹理缓冲区上绘制三角形时,GPU必须知道缓冲区上应该绘制顶点的点的2D坐标。 正是转型帮助我们实现了这一目标。 转换将在下一个教程中详细讨论。 在本教程中,我们将使用一个简单的顶点着色器,除了将输入数据作为输出传递之外什么都不做。

在Direct3D 11教程中,我们将使用高级着色语言(HLSL)编写着色器。 回想一下,我们的顶点数据有一个3D位置元素,顶点着色器根本不对输入进行处理。 生成的顶点着色器如下所示:

 float4 VS( float4 Pos : POSITION ) : SV_POSITION
    {
        return Pos;
    }

  

这个顶点着色器看起来很像C函数。 HLSL使用类似C语法的语言,使C / C ++程序员更容易学习。我们可以看到这个名为VS的顶点着色器采用float4类型的参数并返回一个float4值。在HLSL中,float4是一个4分量向量,其中每个分量都是一个浮点数。冒号定义参数的语义以及返回值。如上所述,HLSL中的语义描述了数据的性质。在上面的着色器中,我们选择POSITION作为Pos输入参数的语义,因为此参数将包含顶点位置。返回值的语义SV_POSITION是具有特殊含义的预定义语义。这种语义告诉图形管道,与语义相关联的数据定义了剪辑空间位置。 GPU需要此位置才能在屏幕上绘制像素。 (我们将在下一个教程中讨论剪辑空间。)在我们的着色器中,我们获取输入位置数据并将完全相同的数据输出回管道。

像素着色器

现代计算机显示器通常是光栅显示器,这意味着屏幕实际上是称为像素的小点的二维网格。 每个像素包含独立于其他像素的颜色。 当我们在屏幕上渲染三角形时,我们并不真正将三角形渲染为一个实体。 相反,我们点亮了三角形区域所覆盖的像素组。 图2显示了这一点。

图2.左:我们想要绘制的内容。 右:屏幕上实际显示的是什么。

将由三个顶点定义的三角形转换为由三角形覆盖的一组像素的过程称为光栅化。 GPU首先确定被渲染的三角形覆盖哪些像素。 然后它为每个像素调用活动像素着色器。 像素着色器的主要用途是计算每个像素应具有的颜色。 着色器对要着色的像素进行某些输入,计算像素的颜色,然后将该颜色输出回管道。 它所采用的输入来自活动几何着色器,或者,如果不存在几何着色器,例如本教程中的情况,则输入直接来自顶点着色器。

我们在上面创建的顶点着色器输出一个带有语义SV_POSITION的float4。 这将是我们的像素着色器的输入。 由于像素着色器输出颜色值,因此像素着色器的输出将为float4。 我们给输出语义SV_TARGET以表示输出到渲染目标格式。 像素着色器如下所示:

float4 PS( float4 Pos : SV_POSITION ) : SV_Target
    {
        return float4( 1.0f, 1.0f, 0.0f, 1.0f );    // 黄色, 同时透明度为1
    }

  

创建着色器

在应用程序代码中,我们需要创建一个顶点着色器和一个像素着色器对象。 这些对象代表着色器,通过调用 D3DX11CompileFromFile()创建。 代码如下所示:

    // 创建顶点着色器
    if( FAILED( D3DX11CompileFromFile( "Tutorial03.fx", NULL, NULL, "VS", "vs_4_0", D3DCOMPILE_ENABLE_STRICTNESS, NULL, NULL, &pVSBlob, &pErrorBlob, NULL ) ) )
        return FALSE;

    // 创建像素着色器
    if( FAILED( D3DX11CompileFromFile( "Tutorial03.fx", NULL, NULL, "PS", "ps_4_0", D3DCOMPILE_ENABLE_STRICTNESS, NULL, NULL, &pPSBlob, &pErrorBlob, NULL ) ) )
        return FALSE;

  

把它放在一起

在遍历图形管道之后,我们可以开始理解渲染我们在教程2开始时创建的三角形的过程。创建Direct3D应用程序需要两个不同的步骤。

  1. 第一个阶段是在顶点数据中创建源数据,正如我们在教程2中所做的那样。
  2. 第二个阶段是创建着色器,这些着色器将转换该数据以进行渲染,我们在本教程中展示了这些。

原文地址:https://www.cnblogs.com/OctoptusLian/p/9747780.html

时间: 2024-10-11 10:44:55

Direct3D 11 Tutorial 3: Shaders and Effect System_Direct3D 11 教程3:着色器和效果系统的相关文章

Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器

上一节中,利用纹理的 RGB 通道值 作为灰度,来控制像素的透明度,这种方式叫做半透明着色器. 这一节学习透明裁剪着色器,仍然是读取 RGB 通道值,赋值给 alpha,然后指定一个固定值作为标尺,如果 alpha < 标尺,就抛弃这个片段,也就是裁减掉不显示. 这一次实现的效果如下图 适合作为怪物死亡的效果. 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn 下面开始学习. 搭建好场景,新建Material,新建Shader.

【Unity Shaders】Lighting Models —— 衣服着色器

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 布料(Cloth)是另一种非常常见的着色需求,在很多实时游戏中都需要它来实现更真实的交互体

Direct3D 11 Tutorial 2: Rendering a Triangle_Direct3D 11 教程2:渲染一个三角形

概要 在之前的教程中,我们建立了一个最小的Direct3D 11的应用程序,它用来在窗口上输出一个单一颜色.在本次教程中,我们将扩展这个应用程序,在屏幕上渲染出一个单一颜色的三角形.我们将通过设置数据机构的过程关联到三角形. 这个教程的输出结果是在窗口中央渲染出一个三角形. 资源目录 (SDK root)\Samples\C++\Direct3D11\Tutorials\Tutorial02 Github-LearnDirectX-DX3D11 tutorial02 (源码已上传至Github)

Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间

概述 在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形. 我们没有太注意我们在顶点缓冲区中拾取的顶点位置. 在本教程中,我们将深入研究3D位置和转换的细节. 本教程的结果将是渲染到屏幕的3D对象. 虽然之前的教程侧重于将2D对象渲染到3D世界,但在这里我们展示了一个3D对象. 资源目录 (SDK root)\Samples\C++\Direct3D11\Tutorials\Tutorial04 Github仓库 3D空间 在上一个教程中,三角形的顶点被有策略地放置,以在屏幕上完美地对

Direct3D 11 Tutorial 5: 3D Transformation_Direct3D 11 教程5:3D转型

概述 在上一个教程中,我们从模型空间到屏幕渲染了一个立方体. 在本教程中,我们将扩展转换的概念并演示可以通过这些转换实现的简单动画. 本教程的结果将是围绕另一个轨道运行的对象. 展示转换以及如何将它们组合以实现期望的效果将是有用的. 在我们介绍新概念时,未来的教程将在此基础上构建. 资源目录 (SDK root)\Samples\C++\Direct3D11\Tutorials\Tutorial05 Github 转型 在3D图形中,变换通常用于对顶点和矢量进行操作. 它还用于将它们在一个空间中

顶点着色器详解 (Vertex Shaders)

学习了顶点处理,你就知道固定功能流水线怎么将顶点从模型空间坐标系统转化到屏幕空间坐标系统.虽然固定功能流水线也可以通过设置渲染状态和参数来改变最终输出的结果,但是它的整体功能还是受限.当我们想实现一个外来的光照模型,外来的Fog或者点大小计算方式,等等,我们可能就放弃使用固定功能流水线,转而使用CPU来实现这些计算. 使用vertex shaders,它用一段小程序替换固定功能处理.这段小程序的输入是模型空间的顶点,输出齐次剪裁空间的顶点,并且还携带一些信息,如:per-vertex diffu

1.3 Debugging of Shaders (调试着色器)

说实话这一章真没怎么看懂,不过先写出来吧,理解多少是多少,不对的地方欢迎大虾们批评指正. 本章主要讲述了如何对unity中的shander进行调试.其调试技术据说是个很久远的技术@_^这里举了一个如何生成假色图(false-color  images)的例子,通过改变片段着色器fragment   shader中color属性的输入参数值(即RGB某一基色的亮度)来得到着色器shader的输出数值. 上一章讲了如何将顶点着色器vertex  shader结构体中的输出参量作为片段着色器fragm

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

11.6 MariaDB安装;11.7 Apache安装(上)11.8 Apache安装(中)11.9 Apache安装(下)

11.6 MariaDB安装 1. 进入下载安装包目录: [[email protected] ~]# cd /usr/local/src 2. 下载mariadb安装包: [[email protected] src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.tar.gz 3. 解包