Shader中的SV_POSITION vs POSITION解释

本文解析了在Shader中SV_POSITION与POSITION的区别,前者用于固定顶点位置,不可修改,常用于输出到裁剪空间;后者在DX10前通用,但推荐在现代API中使用SV_POSITION。两者在输入输出阶段的角色和用途各有侧重。
摘要由CSDN通过智能技术生成

在看shader代码的时候,看到过 SV_POSITION 、 POSITION 两个位置的定义,查资料了解一下

以前需要得到定点位置,vertex shader或者fragment shader中输入输出语义绑定都是用的POSITION,和SV_POSITION的区别是什么呢?

SV_POSITION:SV_前缀的变量代表system value,在DX10以后的语义绑定中被使用代表特殊的意义,和POSITION用法并无不同。

唯一区别是 SV_POSTION一旦被作为vertex shader的输出语义,那么这个最终的顶点位置就被固定了(不能tensellate,不能再被后续改变它的空间位置?),已经成为了转换裁剪世界的坐标,是可以直接用来进入光栅化处理的坐标,如果作为fragment shader的输入语义那么和POSITION是一样的,代表着每个像素点在屏幕上的位置(这个说法其实并不准确,事实是fragment 在 view space空间中的位置,但直观的感受是如括号之前所述一般) 

其次:在DX10版本之前没有引入SV_的预定义语义,POSITION被用作vertex shader的输入,输出,fragment shader的输入参数。但DX10之后就推荐使用SV_POSITION作为vertex shader的输出和fragment shader的输入了,注意vertex shader的输入还是使用POSITION!切记。但是DX10以后的代码依旧兼容POSITION作为全程表达,估计编译器会自动判断并替换的吧。好了SV_POSITION的疑惑就此解开。

总结:

两个的用法大致相同,都是存储坐标信息,但是一个是转换前的,一个是转换后的。

POSITION:用来存储,模型在本地坐标下,模型空间中(objcet space)的顶点坐标,转换为剪裁空间坐标前的坐标,unity告诉我们的模型顶点坐标,没经过转换的。可用作定点着色器(vertex shader)的输入、输出;片元着色器(frag)的输入。

SV_POSITION:用来存储,模型在剪裁空间,投影空间中的位置信息,即把模型空间的定点坐标,转化为剪裁空间的坐标,可用作定点着色器(vertex shader)的输出;片元着色器(frag)的输入。

a2f用的position v2f用的svposition。

参考文章:https://blog.csdn.net/zhao_92221/article/details/46797969

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值