DirectX11(二)

官方SDK的翻译,SDK下载地址含例子

图形流水线

在前面的教程中,我们设置顶点缓冲区,然后将顶点布局与顶点着色器关联起来。现在,我们将解释着色器是什么,以及它是如何工作的。为了充分理解单个着色器,我们将后退一步,看看整个图形管道。
在教程2,当我们称之为vssetshader()和pssetshader(),实际上我们绑定我们的着色器到管道中的一个阶段。然后,当调用绘图时,我们开始处理传递到图形管道中的顶点数据。下面的部分详细描述了在绘制命令之后发生了什么。

着色器

在Direct3D 11,着色器驻留在图形流水线的不同阶段。它们是由GPU执行的短程序,输入一定的输入数据,处理数据,然后将结果输出到管道的下一个阶段。Direct3D 11支持三种基本类型:顶点着色器、几何着色器和像素着色器。顶点着色器以顶点作为输入。它是通过顶点缓存传递给GPU的每个顶点运行一次。一个几何着色器将一个图元作为输入,并为传递给GPU的每个原语运行一次。本原是一个点、一条线或一个三角形。像素着色器将一个像素(有时称为片段)作为输入,并为我们希望渲染的图元的每个像素运行一次。当使用Direct3D 11渲染,GPU必须有一个有效的顶点着色器和像素着色器。几何着色器是Direct3D 11的高级特性,是可选的,所以我们在这里不讨论几何着色器。

顶点着色器

顶点着色器是由GPU在顶点上执行的短程序。将顶点着色器视为C函数,将每个顶点作为输入,处理输入,然后输出修改后的顶点。应用程序通过顶点数据在顶点缓冲区的形式GPU后,GPU遍历顶点缓冲中的顶点,并执行一次激活的顶点着色器顶点,把顶点数据到顶点着色器的输入参数。
虽然顶点着色器可以用于执行许多任务,但顶点着色器最重要的工作是变换。变换是将向量从一个坐标系转换到另一个坐标系的过程。例如,3d场景中的三角形可以在位置(0, 0, 0)(1, 0, 0)(0, 1, 0)中有顶点。当在2D纹理缓冲区绘制三角形时,GPU必须知道缓冲区上的点的二维坐标,绘制顶点。正是这种转变帮助我们完成了这一任务。转换将在下一个教程中详细讨论。在本教程中,我们将使用一个简单的顶点着色器,它除了通过输出传递输入数据外,什么也不做。
在Direct3D 11的教程,我们将在高级着色语言编写着色器(HLSL)。回想一下,我们的顶点数据有一个3D位置元素,顶点着色器不会对输入进行任何处理。得到的顶点着色器看起来如下所示:

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

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

像素着色器

现代计算机显示器通常是光栅显示器,也就是说屏幕实际上是一个叫做像素的小圆点的二维网格。每个像素包含一个独立于其他像素的颜色。当我们在屏幕上渲染一个三角形时,我们并不把三角形当作一个实体来渲染。相反,我们点亮三角形区域覆盖的像素组。如下图。
这里写图片描述
将一个由三个顶点定义的一堆三角形覆盖的像素的三角形称为光栅化过程。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 );    // Yellow, with Alpha = 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;

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值