官方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;

DirectX11(二)相关推荐

  1. Dx11DemoBase 基类(二) 初始化 DirectX11 的 4个基本步骤

    上文说的 要用现实现象来模拟解释 初始化 Direct3D11的过程, 呃... 暂时想不出了, 呵呵. 一般初始化 Direct3D11的过程, 分为四步: bool Dx11DemoBase::I ...

  2. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  3. Intel MediaSDK sample_decode 官方GPU解码流程学习(二) - 在双显卡机器上实现DirectX11 D3D11和OpenCL共享资源

    很久以前写过有关D3D11和OCL直接共享显存的代码, Intel MediaSDK sample_decode 官方GPU解码流程学习 - DirectX11 D3D11和OpenCL共享资源 这段 ...

  4. C++Directx11开发笔记二:Direct3D基础设备的初始化

    最近正在学习Directx 11的开发,上一次记录了Win32应用程序的基础,主要是注册窗体类,加载图标和鼠标,处理事件循环等,链接为:C++Directx11开发笔记一:Win32应用程序窗体创建. ...

  5. Directx11基础教程二之Directx11初始化

    一,看本节教程前应该掌握: (1)掌握  D3D11基础教程一之D3D11框架 二,程序的结构如下: 具体在VS2015的代码: 三,程序的具体代码如下: 好的,下面D3D11的初始化我分为十二个步骤 ...

  6. DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现

    前言 这一章我们主要学习由6个纹理所构成的立方体映射,以及用它来实现一个静态天空盒. 但是在此之前先要消除两个误区: 认为这一章的天空盒就是简单的在一个超大立方体的六个面内部贴上天空盒纹理: 认为天空 ...

  7. DirectX11 With Windows SDK--01 DirectX11初始化

    DirectX11 With Windows SDK--01 DirectX11初始化 原文:DirectX11 With Windows SDK--01 DirectX11初始化 前言 由于个人觉得 ...

  8. DirectX11 With Windows SDK--27 计算着色器:双调排序

    前言 上一章我们用一个比较简单的例子来尝试使用计算着色器,但是在看这一章内容之前,你还需要了解下面的内容: 章节 26 计算着色器:入门 深入理解与使用缓冲区资源(结构化缓冲区/有类型缓冲区) Vis ...

  9. [DirectX11]Gerstner波 实现简单的水面模拟

    上一篇文章中,介绍了一个简单数值方法来模拟圆形扩散波的效果,但是这种方法对于自然中像海浪一样的波 就无能为力了.所以,这篇文章介绍用Gerstner波来模拟水面波纹效果. 一.Gerstner波介绍 ...

  10. DirectX11 With Windows SDK--07 添加光照与常用几何模型、光栅化状态

    DirectX11 With Windows SDK--07 添加光照与常用几何模型.光栅化状态 原文:DirectX11 With Windows SDK--07 添加光照与常用几何模型.光栅化状态 ...

最新文章

  1. 7 centos 源码安装samba_在CentOS7.6里编译安装PHP7.4(最新版),很详细
  2. 给羊羔:学习web前端开发的路线(一)
  3. XP快速启动栏里的显示桌面没有了,其他的都还在,应该怎么再添加进去?
  4. samba服务器有什么安全风险_自体脂肪填充面部安全吗?有什么风险?
  5. r 保留之前曲线_R简单数据处理和分析
  6. inxni扫地机器人_实用型助手,inxni以内扫地机器人 X332
  7. [共享]一个文件上传的控件,绝对是精品源码
  8. qimage加载bmp图片_9个最佳的优化动态gif图片大小的工具
  9. ajax请求在线库,跨域 jQuery库ajax请求
  10. w2008 R2 401 - 未授权: 由于凭据无效,访问被拒绝。
  11. 事业编,突然接到换岗通知,作为个人能怎么办?能拒绝换岗吗?拒绝的后果是什么?
  12. J2EE中使用MediaInfo库获取视频信息
  13. 计算机专业技术面试题
  14. 如何使用python做中文情感分析
  15. SpringBoot —— 实现邮件、短信的发送功能
  16. springboot-3-整合ehcache缓存
  17. 二级路由dhcp关闭连不上wifi_如何解决家里Wifi能连接,但上不去网怎么办?
  18. 什么是Armbian
  19. zabbix Trapper 监控项配置(39)
  20. 企业AD域(域控服务器)的安装和配置详细教程

热门文章

  1. 使用jib发布代码流程
  2. oracle按序号排序,Oracle排序以及序号的显示
  3. 【笔记本双屏外界显示屏分辨率调高】解决方法
  4. 0基础学php燕十八,燕十八PHP公益培训 PHP基础视频教程 (60集全)
  5. nodejs websocket 聊天应用
  6. 樊登读书会2016年推荐书目汇总
  7. 计算机配置内存在哪看,从哪里看电脑配置
  8. Debian(Linux) 安装Windows通用字体(可解决TimesNewRoman等字体的报错)
  9. [单片机框架][DFU] Dfu升级例子 带crc校验+超时机制+led指示灯+芯片加锁+芯片自擦
  10. VM虚拟机分区硬盘/安装win10系统