原文: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 的例子

cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
void VS(
float3 iPosL : POSITION,
float4 iColor : COLOR,
out float4 oPosH : SV_POSITION,
out float4 oColor : COLOR)
{
// Transform to homogeneous clip space.
oPosH = mul(float4(iPosL, 1.0f), gWorldViewProj);
// Just pass vertex color into the pixel shader.
oColor = iColor;
}

  这个顶点 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 的时候, 这个标记依旧可以是任意的合法标识符.


代码说明

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 中在进行讨论

oColor = iColor;

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


重构

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

cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
struct VertexIn
{
float3 PosL : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn vin)
{
VertexOut vout;
// Transform to homogeneous clip space.
vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj);
// Just pass vertex color into the pixel shader.
vout.Color = vin.Color;
return vout;
}

最新文章

  1. Twisted随笔
  2. bzoj4462: [Jsoi2013]编程作业
  3. Vim 配置 winmanager
  4. 51nod1256乘法逆元
  5. MVC——数据库增删改查(aspx)
  6. MySQL分区表例子——List分区
  7. jQuery模拟瀑布流布局
  8. 图的邻接链表实现(c)
  9. hibernate得知——Set设置配置
  10. flex chrome浏览器调试flex程序
  11. BigDecimal四舍五入使用总结
  12. 201521123062《Java程序设计》第8周学习总结
  13. OpenGL下多个sampler在shader中的使用
  14. python3 练手实例1 计算三角形周长和面积
  15. Excel身份证验证,身份证校验公式
  16. Wpf 之Canvas介绍
  17. Linux 查看磁盘读写速度IO使用情况
  18. day30 __hash__ 计算哈希值
  19. hdu2328 Corporate Identity【string库使用】【暴力】【KMP】
  20. AutoMapper之自定义解析

热门文章

  1. 在Jsp中调用静态资源,路径配置问题
  2. C++面向对象高级编程(下)第二周-Geekband
  3. 通过three.js实现简易3D打印模型切片展示
  4. Last- Linux必学的60个命令
  5. 使用ResponseEntity进行返回json数据
  6. 嘴巴题6 BZOJ3450JoyOI1952 Easy
  7. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)
  8. 使用git命令从github上clone项目
  9. JS钩子的机制与实现
  10. 位操作(求[a, b] 中二进制位为1的个数最多的数)