DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER
原文: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;
}DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER的更多相关文章
- DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER
		原文:DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u01033 ... 
- DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS
		原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.c ... 
- DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES
		原文:DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010 ... 
- DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS
		原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0 ... 
- DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS
		原文:DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ... 
- DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER
		原文:DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ... 
- DirectX11笔记(三)--Direct3D初始化2
		原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ... 
- DirectX11笔记(二)--Direct3D初始化1之基本概念
		原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ... 
- DirectX11笔记(三)--Direct3D初始化代码
		原文:DirectX11笔记(三)--Direct3D初始化代码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article ... 
随机推荐
- [编织消息框架][netty源码分析]11 ByteBuf 实现类UnpooledHeapByteBuf职责与实现
			每种ByteBuf都有相应的分配器ByteBufAllocator,类似工厂模式.我们先学习UnpooledHeapByteBuf与其对应的分配器UnpooledByteBufAllocator 如何 ... 
- C动态分配内存
			malloc分配内存时不初始化,calloc分配内存并进行初始化. 
- vue中使用vue-echarts
			一.先说在原生里怎么使用echarts <!-- 1.引入echarts文件 --> <script src="echarts.min.js"></s ... 
- Jeecms之JSP访问action类
			因为Jeecms采用spring容器管理类,在web容器加载的时候类都已经实例化好了.我们可以通过在JSP中访问spring上下文的方式来调用action业务类例: ApplicationContex ... 
- jeeCMS首页加载流程
			版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/gyshun/article/details/79669293 如果JEECMS部署完毕之后,在浏览器 ... 
- Session - 什么叫一次会话
			转载自:https://blog.csdn.net/qin_xiaofang/article/details/77725946 网上收集的:Session代表服务器与浏览器的一次会话过程,这个过程是连 ... 
- mysql利用MySQLWorkbench生成数据表之间的关系图
			先看结果,默认是展开的,我手动把表折叠了 那么如何实现呢 先点击这里 然后通过向导来创建即可,一直到finish就行了 
- 封装MySQL C API 基本操作
			根据我的以前的文章 http://blog.csdn.net/skyhuangdan/article/details/21099929 链接数据库成功后进行封装. 我封装类使用的是VS2005下的wi ... 
- vue 权限管理
			核心想法: 登陆后获得用户角色,通过角色获得用户的权限,注入权限对应的路由.刷新页面,从localStorage用角色(更好的方式是通过token)再次获得所属权限,再次注入路由.在管理界面左端循环权 ... 
- 数字统计类题目的非数位DP解法
			ZJOI2010 数字统计 上题题意为求[l,r]区间中每个数字(0~9)出现的次数 一般的做法为将区间当成[0,r]-[0,l-1],然后进行数位DP 但事实上将区间当成[0,r]-[0,l-1]后 ... 
