您的位置:首页 > Web前端

Direct3D 11第三节 Shaders and Effect System

2016-04-18 14:53 176 查看

前言

上节建立了顶点缓存区,并在GPU上画了个三角形,这节将逐步操作图形管线,并对Shader和Effect System的概念进行解释。

前言

图形管线The Graphics Pipeline

着色器Shaders
顶点着色器

像素着色器

创建着色器

综上Putting It Together

图形管线(The Graphics Pipeline)

上节,我们设置了顶点缓存区,然后用顶点着色器关联了一个顶点布局,现在我们将解释着色器是什么并且是怎么使用的。为了更深刻的理解着色器,我们将后退一步,看一下整个图形管线的机制。

上节,我们在代码中调用了这两个方法VSSetShader()PSSetShader(),实际上,我们是将着色器设置到了图形管线的某个阶段,然后当我们调用绘制方法时,我们就开始处理已经传给图形管线的数据,这节我们将详细的描述绘制c操作后又发生了什么。

着色器(Shaders)

在Direct3D11中,着色器存在于图形管线的不同阶段。着色器是由GPU负责执行的一段很短的程序,获得并处理特定的输入数据,然后将结果输出到图形管线的下个阶段。Direct3D 11提供了三种基本类型的着色器:顶点着色器几何着色器像素着色器。顶点着色器将顶点作为输入数据,通过顶点缓存将每个顶点数据传给GPU且只运行一次。几何着色器是将基元1作为输入,将每个基元传给GPU且只运行一次,基元可能是一个点、一条线或一个三角形。像素着色器将像素(有时也叫片段)作为输入数据,为我们希望去绘制的基元的每个像素服务。这些着色器操作就是核心部分。当我们使用Direct3D 11去做渲染时,GPU一定要有个顶点着色器和像素着色器,几何着色器是Direct3D 11中先进的功能,并且可选择,因此这节不讨论几何着色器,Direct3D11中还有很多种着色器可以在不同方面发挥强大的优势,更多信息在其他例子中会有介绍。

顶点着色器

顶点着色器是关于顶点数据并由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是四个组件组成的数组,每个组件是一个浮点数。返回值的语义,SV_POSITION,使一个具有特殊意义的预定义,这个语义告诉图形管线,和这个语义关联的数据定义了clip-space位置,位置对于GPU将像素绘制到屏幕上是必要的,下节再讨论clip-space。

像素着色器

现在的电脑监视器通常都是光栅显示,意味着屏幕是由二维的网格点组成,称为像素,当我们在屏幕上绘制三角形的时候,实际上是点亮了三角形覆盖区域中的像素点。

将由三个顶点定义的三角形转成由三角形区域覆盖的一捆像素点的过程叫做光栅化。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()方法创建,代码如下:

// Create the vertex shader
if( FAILED( D3DX11CompileFromFile( "Tutorial03.fx", NULL, NULL, "VS", "vs_4_0", D3DCOMPILE_ENABLE_STRICTNESS, NULL, NULL, &pVSBlob, &pErrorBlob, NULL ) ) )
return FALSE;
// Create the pixel shader
if( FAILED( D3DX11CompileFromFile( "Tutorial03.fx", NULL, NULL, "PS", "ps_4_0", D3DCOMPILE_ENABLE_STRICTNESS, NULL, NULL, &pPSBlob, &pErrorBlob, NULL ) ) )
return FALSE;


综上(Putting It Together)

对图形管线有了一定的了解之后,我们就能去理解上节三角形的渲染过程。创建Direct3D程序需要需要两大步:

一、在顶点数据中创建源数据,正如第二节;

二、创建着色器对数据进行渲染,正如本节。

不确定怎么翻译,java等编程语言中的默认基本数据类型,如:int,long等等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  direct3d