由于semantic的使用,我们有理由相信 vertex shader的output 和 pixel shader的input是按照semantic来匹配的,而跟传入顺序无关。印象dx9时代是这样。

虽然习惯上使用共用的sruct (VS_OUTPUT)来保证senamtic修改的同步,便于维护,但这个不是必须的。

但是最近工作中,在UE4的dx11上写自定义shader,因为VS和PS分开两文件,所以干脆没有用struct,而是直接写到parameter 里,但是遇到一个诡异的问题:参数的值不匹配!

最后发现是 虽然参数semantic匹配,但是参数顺序不匹配导致的。

所以查了一下文档:Shader Signatures

https://msdn.microsoft.com/en-us/library/windows/desktop/bb509650(v=vs.85).aspx

In Direct3D 10, adjacent stages effectively share a register array, where the output shader (or pipeline stage) writes data to specific locations in the register array and the input shader must read from the same locations. The API uses shader signatures to bind shader outputs with inputs without the overhead of semantic resolution

也就是说d3d10以上,为了提升性能,相邻的stage不做semantic resolution,直接按参数顺序绑定。

所以建议使用公共声明的struct。。

如果想用分开的struct (或者直接用parameter list),注意下面的是兼容的 (元素个数不同但参数顺序一致)

// Vertex Shader Output Signature
Struct VSOut
{
float4 Pos: SV_Position;
float3 MyNormal: Normal;
float2 MyTex : Texcoord0;
} // Pixel Shader Input Signature
Struct PSInWorks
{
float4 Pos: SV_Position;
float3 MyNormal: Normal;
}

下面的不兼容 (顺序不一致)

// Vertex Shader Output Signature
Struct VSOut
{
float4 Pos: SV_Position;
float3 MyNormal: Normal;
float2 MyTex : Texcoord0;
} // Pixel Shader Input Signature
Struct PSInFails
{
float3 MyNormal: Normal;
float4 Pos: SV_Position;
}

以上两个例子在上面的链接中有。

MSDN在这里也有简单的说明:

Direct3D 9 to Direct3D 10 Considerations (Porting Shaders: Shader Signatures and Linkage)

[工作积累] D3D10+ 中 Pixel Shader 的input semantic和参数顺序的更多相关文章

  1. [工作积累] android 中添加libssl和libcurl

    1. libssl https://github.com/guardianproject/openssl-android 然后执行ndk-build 2.libcurl 源代码组织结构, 下面的mak ...

  2. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

  3. 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但

    片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但片元着色器是一个更合适的名字, 因为此时的片元并不是一个真正意义上的像素.

  4. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  5. 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL ES中的Shader编程

    在OpenGL ES中,Shader是着色器,包括两种:顶点着色器(Vertex Shader)和片元着色器(Fragment Shader).每个program对象有且仅有一个Vertex Shad ...

  6. Unity3D中的shader基础知识

    1.Unity中配备了强大的阴影和材料的语言工具称为ShaderLab,以程式语言来看,它类似于CgFX和Direct3D的效果框架语法,它描述了材质所必须要的一切咨询,而不仅仅局限于平面顶点/像素着 ...

  7. 作为一名IT从业者,你在工作和学习中,遇到哪些问题

    版权声明:襄阳雷哥的版权声明 https://blog.csdn.net/FansUnion/article/details/28448975 大家都是IT从业者,遇到的问题多少与类似. 假设能把这些 ...

  8. 浅析 python中的 print 和 input 的底层区别!!!

    近期的项目中 涉及到相关知识 就来总结一下 ! 先看源码: def print(self, *args, sep=' ', end='\n', file=None): # known special ...

  9. HTML中让表单input等文本框为只读不可编辑但可以获取value值的方法;让文本域前面的内容显示在左上角,居中

      HTML中让表单input等文本框为只读不可编辑的方法 有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使input text的内容,中国两个字不可以修改   有时候,我们希望 ...

随机推荐

  1. mysql5.7.20 windows 解压缩版安装

    1.下载 文件下载路径:https://dev.mysql.com/downloads/mysql/ 2.配置文件 在解压的文件夹内新建my.ini文件,并加入以下内容: [mysql] # 设置my ...

  2. Python随笔--代理ip

  3. MAC安装flutter开发环境

    #最近在学flutter开发,写一篇记录一下安装的过程 1.配置flutter镜像地址  vim ~/.bash_profile 命令行输入后回车,打开.bash_profile配置镜像地址 expo ...

  4. Docker容器的管理

    创建容器的工作原理: 当利用docker run来创建容器时,Docker在后台运行的标准操作包括:检查本地是否存在指定的镜像,不存在就从公有仓库下载,利用镜像创建并启动一个容器分配一个文件系统,并在 ...

  5. BluePrism初尝

    由于对工作的需求,现在开始接触了RPA. RPA是什么?第一次看见这个名词,我脑海里只有RPG的概念.一番查询,才知道是Robotic Process Automation的英文缩写,机器人流程自动化 ...

  6. shell练习题6

    需求如下: 有日志access.log,部分内容如下: 127.0.0.1 - - [03/Jul/2018:00:00:01 +0800] "GET / HTTP/1.1" 20 ...

  7. Visitor 模式心得

    最近读到Visitor模式,还是一知半解的.偶然翻到Uncle Bob对该模式的推导过程,有所心得,和大家分享一下. Uncle Bob 的链接是: http://butunclebob.com/Ar ...

  8. 信息技术手册可视化进度报告 基于jieba的关键字提取技术

    在这一篇博客之前,我已经将word文件中的内容通过爬虫的方式整理到数据库中了,但是为了前台展示的需要,还必须提取出关键字,用于检索. 我用的是jieba分词,GitHub地址:https://gith ...

  9. Openresty 源码安装脚本

    Openresty 中文官网地址 http://openresty.org/cn/ #! /bin/bash function openrestyinstall() { cd /opt/openres ...

  10. QWaiteCondition思考4

    引用 http://blog.csdn.net/flyoxs/article/details/54617342 简单用法 QWaitCondition 用于多线程的同步,一个线程调用QWaitCond ...