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 ...
随机推荐
- Frame用navigate导航到新页面后导航条隐藏的方法
设置Frame的NavigationUIVisibility="Hidden"
- vue-cli 构建项目
1.安装vue-cli和webpack npm install webpack -g npm install vue-cli -g 2.vue-cli初始化项目 vue init webpack-si ...
- springMVC和springBoot区别
Spring MVC是什么?(1)Spring MVC是Spring提供的一个强大而灵活的模块式web框架.通过Dispatcher Servlet, ModelAndView 和 View Reso ...
- 8种nosql数据库对比
1. CouchDB 所用语言: Erlang 特点:DB一致性,易于使用 使用许可: Apache 协议: HTTP/REST 双向数据复制, 持续进行或临时处理, 处理时带冲突检查, 因此,采用的 ...
- mysql5.7基于gtid进行搭建主从复制过程
gtid_mode = onenforce-gtid-consistency = onskip_name_resolve # 去掉域名解析二进制日志必须开启,且格式为ROWserver-id必须配置成 ...
- mysql分区与分表的区别
分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中. mysql支持的分区类型包括Range.List.Hash.Key,其中Range比较常用: RANGE分区:基于属于一个给定连续区 ...
- MyBatis与JPA的区别是什么
MyBatis分为全注解版和xml版:全注解版适合于小项目,直接在方法上加注解,在注解中写sql 仓储Repository 模式是领域驱动设计中另一个经典的模式.在早期,我们常常将数据访问层命名为:D ...
- CentOS 6.5 FTP安装配置
安装配置 rpm -q vsftpd #检查是否安装了FTP yum -y install vsftpd #安装FTP chkconfig vsftpd on #设置开机启动 service vsft ...
- 用js实现base64编码器
base-64作为常见的编码函数,在基本认证.摘要认证以及一些HTTP扩展中得到了大量应用.在前端领域,也常常把图片转换为base-64编码在网络中传输.本文将详细介绍base64的原理及用js实现b ...
- Asio与Boost.Asio
译自http://think-async.com/Asio/AsioAndBoostAsio Asio有两种变体:(非Boost)Asio和Boost.Asio.本文概要描述二者的不同. 1. 源代码 ...