“SV_TARGET”与“SV_POSTION”

本文介绍了GPU的语义绑定概念,特别是SV_TARGET和SV_POSITION在渲染管线中的作用。SV_POSITION用于固定顶点位置,而SV_TARGET是片元着色器颜色输出的语义。理解这些有助于深入掌握GPU渲染工作流程。
摘要由CSDN通过智能技术生成

每次写片元着色器的时候都会忘记写“SV_TARGENT”,归根到底还是基本功不扎实,没有明白底层原理,现在就来总结归纳一下

1、语义绑定
首先要明白的是两者的属性,这两个都是语义绑定(semantics binding)。什么是语义绑定呢?语义绑定可以理解为关键字,我们都知道图形渲染是按照一步一步地进行的,又叫做渲染管线。那么为什么是要一步一步地进行呢?因为GPU的架构与CPU非常不同,cpu更像是人的大脑,可以同时思考不同的问题,而GPU则相当于计算机,通过有特定的输入,通过计算得到最终的输出。GPU没有像CPU一样的堆栈来存取变量与值,所以通过语义绑定将一个计算好的值放在一个物理存储位置,再用的话就利用语义绑定去特定物理位置取出,这也是GPU不能像CPU一样工作的原因之一吧。

有兴趣的同学可以去看一些关于GPU架构的基础的知识,对理解Shader底层有很大的帮助

2、工作流程
SV_前缀的变量代表system value的意思,在DX10+的语义绑定中被使用代表特殊的意义,SV_POSITION在用法上和POSITION是一样的,区别是 SV_POSTION一旦被作为vertex函数的输出语义,那么这个最终的顶点位置就被固定了,不得改变。DX10+推荐使用SV_POSITION作为vertex函数的输出和fragment函数的输入,而vertex函数的输入还是使用POSITION。也就是说推荐你在片元着色器前完成对顶点的位置转换(注意不是说在顶点着色器完成全部的顶点位置转换,有些着色器中会在

这段代码实现了一个自定义的黑白化着色器(Shader),使用了Unity Shader语言(CGPROGRAM)来编写顶点着色器(vertex)和片段着色器(fragment)。 其中,通过定义一个名为_MainTex的2D纹理(texture)属性,让Shader可以接收要处理的图片。顶点着色器将输入的顶点信息(POSITION和TEXCOORD0)转换为裁剪空间下的顶点位置(UnityObjectToClipPos)和纹理坐标(uv),片段着色器使用tex2D函数从_MainTex中读取像素颜色,然后计算出灰度值(gray)并返回一个新的颜色(fixed4)。 但是这段代码没有考虑到透明区域的处理,因此会出现透明区域显示为黑色的问题。要解决这个问题,可以在片段着色器中,根据像素的alpha值来判断是否透明,如果透明则直接返回一个透明的颜色,否则再进行黑白化处理。 修改后的代码如下所示: ``` Shader "Custom/BlackAndWhite" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag uniform sampler2D _MainTex; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float4 color : COLOR; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; o.color = tex2D(_MainTex, v.uv); return o; } fixed4 frag (v2f i) : SV_Target { if (i.color.a == 0) { return fixed4(0, 0, 0, 0); } else { float gray = dot(i.color.rgb, float3(0.299, 0.587, 0.114)); return fixed4(gray, gray, gray, i.color.a); } } ENDCG } } FallBack "Diffuse" } ``` 修改后的代码中,我们在顶点着色器中新增了一个color属性,用于记录每个像素的颜色信息。在片段着色器中,首先判断当前像素的alpha值是否为0,如果是则直接返回一个透明的颜色(fixed4(0, 0, 0, 0)),否则再进行黑白化处理。这样就可以避免透明区域显示为黑色的问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值