DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER
2017-12-12 23:14
295 查看
前言
像素 shader
像素 shader示例
重构
![](https://img-blog.csdn.net/20171212004508119?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDMzMzczNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
作为一种硬件优化方式, 通过渲染管线在进入 pixel shader 阶段之前过滤掉一部分像素片段是可行的. 比如 early-z, 他是将深度检测提前, 以达到根据深度值预先筛除部分像素片段, 降低像素 shader 运算量的目的. 当然这种技术的局限是当像素 shader 会改变深度信息的时候就无法使用了.
注意像素 shader 的输入与顶点 shader 的输出是要求严格对应的, 像素 shader 返回了一个四维的向量来表示颜色, 在参数列表后面的 SV_Target 表明返回值的类型需要和 render target 的格式匹配.
像素 shader
像素 shader示例
重构
前言
之前讨论渲染管线的时候提到过, 在光栅化阶段, 顶点 shader 的输出会通过插值填充到三角形的像素中, 插值之后的结果被作为输入传到像素 shader 中. 不考虑 Geometry shader, 下图显示了到现在顶点数据的传递过程.像素 shader
像素 shader 和顶点 shader 类似, 只不过他是每一个像素片段( pixel fragment )都会执行. 注意并不一定所有结果都会被存储到 back buffer 中, 他们有可能被裁减, 有可能不能通过后面阶段的深度模板缓冲测试等. 换句话说, back buffer 中的一个像素可能会有几个像素片段的候选值, 这也是像素片段和像素的区别.作为一种硬件优化方式, 通过渲染管线在进入 pixel shader 阶段之前过滤掉一部分像素片段是可行的. 比如 early-z, 他是将深度检测提前, 以达到根据深度值预先筛除部分像素片段, 降低像素 shader 运算量的目的. 当然这种技术的局限是当像素 shader 会改变深度信息的时候就无法使用了.
像素 shader示例
下面的示例 VS 部分与之前的示例一致, 这个例子 PS 除了返回输入的颜色什么都没有做.cbuffer cbPerObject { float4x4 gWorldViewProj; }; void VS(float3 iPos : POSITION, float4 iColor : COLOR, out float4 oPosH : SV_POSITION, out float4 oColor : COLOR) { // Transform to homogeneous clip space. oPosH = mul(float4(iPos, 1.0f), gWorldViewProj); // Just pass vertex color into the pixel shader. oColor = iColor; } float4 PS(float4 posH : SV_POSITION, float4 color : COLOR) : SV_Target { return pin.Color; }
注意像素 shader 的输入与顶点 shader 的输出是要求严格对应的, 像素 shader 返回了一个四维的向量来表示颜色, 在参数列表后面的 SV_Target 表明返回值的类型需要和 render target 的格式匹配.
重构
和之前 VS 一样, 我们可以通过使用结构体来重构优化 shader 的代码.cbuffer cbPerObject { float4x4 gWorldViewProj; }; struct VertexIn { float3 Pos : 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.Pos, 1.0f), gWorldViewProj); // Just pass vertex color into the pixel shader. vout.Color = vin.Color; return vout; } float4 PS(VertexOut pin) : SV_Target { return pin.Color; }
相关文章推荐
- DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER
- DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER
- DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS
- DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS
- DirectX11笔记(十二)--Direct3D渲染8--EFFECTS
- DirectX11笔记(三)--Direct3D初始化代码
- DirectX11笔记(四)--渲染管线
- DirectX11 渲染 学习笔记(2) 纹理/贴图映射
- Introduction to 3D Game Programming with DirectX 11学习笔记 6 Direct3D中的绘制(四)渲染状态
- DirectX11笔记(二)--Direct3D初始化1之基本概念
- 摸爬滚打DirectX11_day03——Direct3D中的渲染五部曲
- Direct3D学习笔记:渲染管线
- DirectX11笔记(三)--Direct3D初始化2
- DirectX11 Direct3D基本概念
- iOS学习笔记(1)— UIView 渲染和内容管理
- 摸爬滚打DirectX11_day03——Direct3D的初始化
- Unity Graphics (Unity 图形渲染 ) 官方教程文档笔记系列之五
- 【 4000 UnityShader】学习笔记 可编程渲染管线结构及语义
- 《冯乐乐》渲染流水线中的三个概念阶段——笔记整理
- Ogre2.1 分析笔记(五) 渲染流程(二)