D3D12渲染技术之顶点着色器

相信大家以前用过D3D9的或是编写过Shader的对顶点着色器都比较了解,现在我们回顾一下:

cbuffer cbPerObject : register(b0)
{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的编程语言我们称为HLSL(the high level shading language),语法跟C++类似,比较容易学习。我们教HLSL和编程着色器的方法将以示例为基础, 也就是说,随着博客的进展,我们将介绍需要的任何新的HLSL概念,以便实现Demo的演示, 着色器脚本通常用基于文本的文件编写,扩展名为.hlsl。

顶点着色器是名为VS的函数, 请注意,可以为顶点着色器指定任何有效的函数名称, 该顶点着色器有四个参数; 前两个是输入参数,后两个是输出参数(由out关键字表示)。 HLSL没有引用或指针,因此要从函数返回多个值,需要使用结构或输出参数, 在HLSL中,函数始终内联。

前两个输入参数构成顶点着色器的输入签名,并对应于我们用于绘制的自定义顶点结构中的数据成员。 参数语义“:POSITION”和“:COLOR”用于将顶点结构中的元素映射到顶点着色器输入参数,如下图所示。

这里写图片描述
每个顶点元素都有一个由D3D12_INPUT_ELEMENT_DESC数组指定的相关语义, 顶点着色器的每个参数也具有附加的语义, 语义用于将顶点元素与顶点着色器参数进行匹配。

输出参数也有附加的语义(“:SV_POSITION”和“:COLOR”),这些用于将顶点着色器输出映射到下一级的相应输入(几何着色器或像素着色器)。 请注意,SV_POSITION语义是特殊的(SV代表系统值), 它用于表示在裁剪空间中保存顶点位置的顶点着色器输出元素。 我们必须将SV_POSITION语义附加到位置输出,因为GPU需要知道这个值,因为它涉及其他属性不涉及的操作,例如裁剪,深度测试和光栅化, 非系统值的输出参数的语义名称可以是任何命名有效的语义名称。
第一行通过乘以4×4矩阵gWorldViewProj将顶点位置从局部空间转换为均匀裁剪空间:

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

使用构造函数语法float4(iPosL,1.0f)构造一个4D向量,相当于float4(iPosL.x,iPosL.y,iPosL.z,1.0f); 因为我们知道顶点的位置是点而不是矢量,所以我们在第四个分量中放置1(w = 1)。 float2和float3类型分别代表2D和3D向量。 矩阵变量gWorldViewProj存在于所谓的常量缓冲区中,这将在后面讨论。 内置函数mul用于向量矩阵乘法。 顺便提一下,对于不同大小的矩阵乘法,mul函数是重载的; 例如,可以使用它来乘以两个4×4矩阵,两个3×3矩阵,或1×3矢量和3×3矩阵。 着色器主体中的最后一行只是将输入颜色复制到输出参数,以便将颜色输入到管道的下一个阶段:

oColor = iColor;

我们可以使用返回类型和输入签名的结构(而不是长参数列表)重写上面的顶点着色器:

cbuffer cbPerObject : register(b0)
{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;}

注意:
如果没有几何着色器(后面介绍几何着色器),则顶点着色器必须使用SV_POSITION语义输出到裁剪空间中的顶点位置,因为这是硬件在离开顶点时期望顶点所在的空间 着色器(如果没有几何着色器)。 如果存在几何着色器,则输出裁剪空间位置可以推迟到几何着色器。
顶点着色器(或几何着色器)不执行透视处理, 它只是投影矩阵部分。,透视处理将在稍后由硬件完成。

在管道的顶点属性之间存在链接,该属性由输入布局描述定义。 如果输入的顶点不提供顶点着色器所需的所有输入,则会产生错误。 例如,以下顶点着色器输入签名和顶点数据不兼容:

//--------------
// C++ app code
//--------------
struct Vertex
{XMFLOAT3 Pos;XMFLOAT4 Color;
};D3D12_INPUT_ELEMENT_DESC desc[] =
{{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_PER_VERTEX_DATA, 0},{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_PER_VERTEX_DATA, 0}
};//--------------
// Vertex shader
//--------------
struct VertexIn
{float3 PosL  : POSITION;float4 Color : COLOR;float3 Normal : NORMAL;
};struct VertexOut
{float4 PosH : SV_POSITION;float4 Color : COLOR;
};

VertexOut VS(VertexIn vin) { … }
当我们创建一个ID3D12PipelineState对象时,我们必须指定输入布局描述和顶点着色器。 然后,Direct3D将验证输入布局描述和顶点着色器是否兼容。
顶点数据和输入签名不需要完全匹配, 所需要的是顶点数据提供顶点着色器所期望的所有数据。 因此,允许顶点数据提供顶点着色器不使用的附加数据。 也就是说,以下是兼容的:

//--------------
// C++ app code
//--------------
struct Vertex
{XMFLOAT3 Pos;XMFLOAT4 Color;XMFLOAT3 Normal;
};D3D12_INPUT_ELEMENT_DESC desc[] =
{{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_PER_VERTEX_DATA, 0},{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_PER_VERTEX_DATA, 0},{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 28, D3D12_INPUT_PER_VERTEX_DATA, 0 }
};//--------------
// Vertex shader
//--------------
struct VertexIn
{float3 PosL  : POSITION;float4 Color : COLOR;
};struct VertexOut
{float4 PosH : SV_POSITION;float4 Color : COLOR;
};VertexOut VS(VertexIn vin) { … }

现在考虑的是顶点结构和输入签名具有匹配的顶点元素的情况,但颜色属性的类型是不同的:

//--------------
// C++ app code
//--------------
struct Vertex
{XMFLOAT3 Pos;XMFLOAT4 Color;
};D3D12_INPUT_ELEMENT_DESC desc[] =
{{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_PER_VERTEX_DATA, 0},{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_PER_VERTEX_DATA, 0}
};//--------------
// Vertex shader
//--------------
struct VertexIn
{float3 PosL  : POSITION;int4 Color : COLOR;
};struct VertexOut
{float4 PosH : SV_POSITION;float4 Color : COLOR;
};VertexOut VS(VertexIn vin) { … }

这实际上是合法的,因为Direct3D允许重新解释输入寄存器中的位。 但是,VC ++调试输出窗口提供以下警告:
D3D12 WARNING: ID3D11Device::CreateInputLayout: The provided input signature expects to read an element with SemanticName/Index: ‘COLOR’/0 and component(s) of the type ‘int32’. However, the matching entry in the Input Layout declaration, element[1], specifies mismatched format: ‘R32G32B32A32_FLOAT’.

这不是错误。。。。。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23053.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python编程教程之抽签程序

Python编程教程之抽签程序 介绍 对于喜欢玩抽签、体育彩票等游戏的人来说,抽签程序是一款非常有用的小工具。抽签程序可以用来随机抽取一定数量的幸运儿,而且运行速度快,结果随机性高,不需要人工干预。 那么,Python…

《大众证券报》报道云创大数据等企业谋取新春“开门红”

近日,《大众证券报》以《拼研发、抓项目、拓市场 南京上市公司谋取新春“开门红”》为题发表新闻报道,描绘包括南京云创大数据科技股份有限公司等南京本地上市公司在新春伊始的生机活力景象,报道这些企业是如何围绕主业谋发展,力争…

游戏版《西部世界》来了!NPC全由AI操控,行动自如有理想和记忆,基于最新GAEA技术系统打造

​ChatGPT彻底引爆了AI领域,也点燃了各赛道玩家的热情。 以虚拟交互体验为例,就已经有不少新产品冒头。 不仅像Chat D-ID这类以ChatGPT驱动的虚拟女友bot花样百出,就连游戏AI NPC也变得火热起来,这几天知名游戏公司育碧要推出AI…

游戏版《西部世界》来了!NPC全由AI操控,行动自如有理想和记忆,基于最新GAEA技术系统打造...

萧箫 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT彻底引爆了AI领域,也点燃了各赛道玩家的热情。 以虚拟交互体验为例,就已经有不少新产品冒头。 不仅像Chat D-ID这类以ChatGPT驱动的虚拟女友bot花样百出,就连游戏AI NPC也变得火热起来&#x…

无人出租车被警察截停后逃逸!AI:我当时害怕极了

新智元报道 编辑:好困 袁榭 snailnj 【新智元导读】愚人节当晚,在美国旧金山上演了史上第一场无人驾驶汽车被警察截停后逃逸的事件,画面爆笑。 警察拦车很常见,但是拦AI开的出租车你见过么? 在最近爆火的一段视频中&…

H5营销海报如何制作,在线制作平台分享

互联网影响着我们的生活习惯,很多人获取消息不再是从别人口中听到、从电视上看到、从报纸上阅读到,但一切消息皆可以从互联网上来获取。而商家们也可以通过互联网进行高效、精准的宣传,方式很简单。通过H5海报制作,巧妙的利用互联…

fast-poster 海报生成器,一分钟完成海报开发。

fast-poster 海报生成器,一分钟完成海报开发。 曾几何时,开发一个海报功能,需要调用底层的绘图API,要熟悉各种不友好的GUI代码。 经过N次迭代和线上生产环境的考验。 现在,开发一个海报功能,只需三步。 …

漫画:是喜,还是悲?AI竟帮我们把Office破活干完了

图文原创:亲爱的数据 国产大模型烈火制造。阿里百度字节美团各科技大佬不等闲。 大模型嘛,重大工程,对我等“怀保小民”来说,只关心怎么用,不关心怎么造。 我来介绍一下自己,我是一个写稿男团组合的成员&am…

腾讯云开发者2022年度热文盘点

01 十亿人都在用的健康码运维体系如何设计? 随着疫情防控模式的迭代,健康码访问DAU逐渐趋于下跌,意味着健康码将逐步完成历史使命,见证着疫情的结束。本文特邀腾讯研发工程师李雄政将从技术架构、可观测体系、运营保障体系等运维体…

“F1 车王”昏迷 10 年能受访了?某杂志 AI 生成“舒马赫专访”惹众怒,涉事主编遭解雇...

整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 在赛车世界中,“车王”迈克尔 舒马赫(Michael Schumacher)是无数人心中最伟大的 F1 赛车手:前 16 年的职业生涯几乎刷新了每一项纪录,共获…

马斯克损失126亿美元,仍为世界第二富!网友:“公司太多的烦恼?”

整理 | 朱珂欣 出品 | CSDN程序人生(ID:coder_life) 送人类移民火星,一直是“钢铁侠”马斯克的梦想。 然而,作为拥有 SpaceX 42% 的股份大股东,马斯克近来却事与愿违——火星没去成,还交足了…

「GPT-4.5」来了!地表最强Code Interpreter与Midjourney联动,5分做出大片|附保姆级攻略...

来自|新智元 【导读】Code Interpreter解禁后,可谓游戏规则的改变者。与Midjourney联动做大片,表情包生成,动嘴做表,各种潜能全被一众网友们挖掘出来了。 前段时间,GPT-4变笨引爆舆论,有人甚至把…

GPT-4.5来了!地表最强Code Interpreter与Midjourney联动,5分做出大片 | 附保姆级攻略...

©作者 | 桃子 好困 来源 | 新智元 Code Interpreter解禁后,可谓游戏规则的改变者。与Midjourney联动做大片,表情包生成,动嘴做表,各种潜能全被一众网友们挖掘出来了。 前段时间,GPT-4变笨引爆舆论,有人…

面试不过,大部分是基本功不扎实,来看看这份“地表最强Android面试宝典”

前言 金九银十还有两个月就要来了,错过金三银四的朋友可不能再错过这个黄金时间了。 今年的互联网就业形势 互联网过去几年飞速发展,给的待遇比其他行业都要高不少,并且过去几年入门门槛很低,基本去机构培训几个月就能上岗&…

「GPT-4.5」来了!地表最强Code Interpreter与Midjourney联动,5分做出大片|附保姆级攻略

【导读】Code Interpreter解禁后,可谓游戏规则的改变者。与Midjourney联动做大片,表情包生成,动嘴做表,各种潜能全被一众网友们挖掘出来了。 前段时间,GPT-4变笨引爆舆论,有人甚至把3小时25条额度一口气用…

2022的结尾,对话系统起飞了

文 | 郑楚杰知乎 编者记:近日来,ChatGPT的连续刷屏让人们重新看到了AI的希望,编者通过对ChatGPT的试用,发现其对话能力早已不同于两年前的对话系统了,可以说,有了质的飞跃,向着用户体验奇点迈进…

地表最强Code Interpreter与Midjourney联动,5分做出大片,网友称「GPT-4.5」来了!

夕小瑶科技说 分享 来源 | 新智元 Code Interpreter解禁后,可谓游戏规则的改变者。与Midjourney联动做大片,表情包生成,动嘴做表,各种潜能全被一众网友们挖掘出来了。 前段时间,GPT-4变笨引爆舆论,有人甚至…

OpenAI最强多模态语言模型来了:GPT-4发布

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

六足仿生机器人的控制与实现

目 录 摘 要 I Abstract II 1 文献综述 1 1.1 国外六足仿生机器人的发展情况 1 1.2 国内六足仿生机器人的发展情况 2 1.3 六足仿生机器人研究中存在的问题 2 1.4 六足仿生机器人的发展趋势 3 1.5 论文的主要内容 3 1.6 小结 4 2 六足仿生机器人的结构分析与步态规划 5 2.1 昆虫…

仿生蛇机器人

仿生类机器人 开头蛇形机器人研究意义结构分析生物结构分析 运动学分析 总结 开头 好久没写这个了,事情太多了,把这学期学的一些分享放上面。随便看看吧。仿生机器人是机器人的一个分支。相比于刚性齿轮结构和传动结构,一些动物的柔性结构使…