原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010333737/article/details/78778192


前言

  Shader其实就是一种GPU来执行的程序, 他使用名为 HLSL ( High Level Shading Language ) 的语言编写, HLSL 是一种和 C++ 格式接近的语言, 很容易学习, 这里不会详细介绍 HLSL, 但在学习过程中会对例子中用到的特性进行说明. Shader 一般被保存在文本文件中, 我们的例子中把这个文件称为 effect file, 文件后缀为 fx, 其实这就是一个普通的文本文件, 存储着 shader 代码.


Vertex Shader示例

  下面的代码展示了一个顶点 shader 的例子

  1. cbuffer cbPerObject
  2. {
  3. float4x4 gWorldViewProj;
  4. };
  5. void VS(
  6. float3 iPosL : POSITION,
  7. float4 iColor : COLOR,
  8. out float4 oPosH : SV_POSITION,
  9. out float4 oColor : COLOR)
  10. {
  11. // Transform to homogeneous clip space.
  12. oPosH = mul(float4(iPosL, 1.0f), gWorldViewProj);
  13. // Just pass vertex color into the pixel shader.
  14. oColor = iColor;
  15. }

  这个顶点 shader 是一个名为 VS 的方法, 方法名可以是任何合法的标识符. VS 有四个参数, 两个入参, 两个用 out 关键字声明的出参. 由于 HLSL 没有引用和指针的概念, 当你想返回多个值得时候, 就必须使用出参或者结构体.

  我们注意到与 C++ 不同的是在参数列表中, 参数后面还有一个标记, 他与我们之前讨论过的 D3D11_INPUT_ELEMENT_DESC 中的 SemanticName 和 SemanticIndex 是对应的( Direct3D渲染1–VERTICES AND INPUT LAYOUTS ). SV_POSITION 是一个特别的标记, 其中的 SV 代表 System Value, SV_POSITION 用来表示顶点 shader 输出的结果保存的是顶点的位置信息. 这是一个固定的名字, 当出参的标记不是 System Value 的时候, 这个标记依旧可以是任意的合法标识符.


代码说明

  1. oPosH = mul(float4(iPosL, 1.0f), gWorldViewProj);

  第一行代码将顶点的自身坐标进行 WVP 变换转化为我们在屏幕上实际看到的位置. float4 的构造函数利用顶点的位置构造一个 4D 的 vector, 然后用这个 vector 和 4 x 4 的 WVP 矩阵相乘完成变换( 内置的 mul 方法有多种重载, 几乎可以对各种规格的向量和矩阵进行乘法操作 ).

gWorldViewProj 矩阵是存储在 constant buffer 中变量, 这个特殊的 buffer 我们在 Direct3D渲染5–CONSTANT BUFFERS 中在进行讨论

  1. oColor = iColor;

  第二行代码只是简单的把输入的颜色拷贝到输出的颜色中, 这相当于顶点 shader 不对颜色做任何处理, 直接传递到下一个渲染阶段中去.


重构

  为了避免出现过长的的参数列表, 我们可以对上面的代码做一个优化, 用结构体来表示输入和输出.

  1. cbuffer cbPerObject
  2. {
  3. float4x4 gWorldViewProj;
  4. };
  5. struct VertexIn
  6. {
  7. float3 PosL : POSITION;
  8. float4 Color : COLOR;
  9. };
  10. struct VertexOut
  11. {
  12. float4 PosH : SV_POSITION;
  13. float4 Color : COLOR;
  14. };
  15. VertexOut VS(VertexIn vin)
  16. {
  17. VertexOut vout;
  18. // Transform to homogeneous clip space.
  19. vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);
  20. // Just pass vertex color into the pixel shader.
  21. vout.Color = vin.Color;
  22. return vout;
  23. }

DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER的更多相关文章

  1. DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER

    原文:DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u01033 ...

  2. DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS

    原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.c ...

  3. DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES

    原文:DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010 ...

  4. DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS

    原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0 ...

  5. DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS

    原文:DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  6. DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER

    原文:DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  7. DirectX11笔记(三)--Direct3D初始化2

    原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ...

  8. DirectX11笔记(二)--Direct3D初始化1之基本概念

    原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ...

  9. DirectX11笔记(三)--Direct3D初始化代码

    原文:DirectX11笔记(三)--Direct3D初始化代码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article ...

随机推荐

  1. BMP 图片格式

     BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...

  2. Java 使用模板生成 Word 文件---基于 Freemarker 模板框架

    Java项目引入 Freemarker 插件自行完成. 步骤如下: .编写 Word 模板,并将模板中要用代码动态生成数据用 Freemarker 变量取代,即${变量名},如${username}: ...

  3. 前缀数组O(n^3)做法

    前缀数组O(n^3)做法 s.substr()的应用非常方便 令string s = "; ); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789&quo ...

  4. IT外包概要

    IT外包 前两天和朋友聊起这个外包的问题,就顺便给他说了一下,自己也整理了一下,发出来,方便更多的人. 如果有说的不准确的地方欢迎大家补充分享. 大致分两种: 项目外包, 人力外包. 简而言之:项目外 ...

  5. light oj 1084 线性dp

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...

  6. mysql基础教程(三)-----增删改、子查询、创建管理表、约束和分页

    插入 INSERT语句语法 从其它表中拷贝数据 • 不必书写 VALUES 子句. • 子查询中的值列表应与 INSERT 子句中的列名对应 update语句 • 可以一次更新多条数据. • 如果需要 ...

  7. c++ string 字符串

    转载   http://www.renfei.org/blog/introduction-to-cpp-string.html 运算符重载 + 和 +=:连接字符串 =:字符串赋值 >.> ...

  8. CentOS 6.5 Apache+SVN使用户可以自己修改密码

    yum -y install php #安装php mkdir /var/www/svnadmin #建立页面目录 vi /var/www/svnadmin/index.php #创建index.ph ...

  9. Python爬虫笔记【一】模拟用户访问之提交表单登入—第二次(7)

    在第一次登入时遇到这个问题,页面验证码与下载下来需要识别的验证码不同的问题,从网上查寻说是叫验证码同步问题.发现是用cookie解决的,那次cookie介绍到通过cookie就可以实现时间戳同步问题, ...

  10. react-native warn Failed to connect to development server using "adb reverse":

    react-native环境搭建中的问题 本文环境说明:开发环境:window10专业版,目标平台:Android react: , react-native: java: 1.8.0_221 pyt ...