cg输入输出匹配规则

最近论坛看到有人提出这样的问题:

Shader "Unlit/testinout"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR)
            {
              pos=float4(objPos,0,1);
              if(pos.x<0){
                col=float4(1,0,0,1);
              }
              else
              {
                col=float4(0,1,0,1);
              }
            }
            void frag(inout float4 col:COLOR)  //输出的并不是col的颜色?????
            {
            }
            ENDCG
        }
    }
}

这个问题其实是语义绑定的规则,上面的片段着色器其实输出的是pos这个变量,并不是col。

注意:语义绑定是顶点和片段之间的桥梁,是一对一的关系,是根据类型进行匹配的,不是根据名称去匹配的。

正确的写法有如下几种

方法一:增加输入参数

    Shader "a958832776/testinout"
    {
        SubShader
        {
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR)
                {
                  pos=float4(objPos,0,1);
                  if(pos.x<0){
                    col=float4(1,0,0,1);
                  }
                  else
                  {
                    col=float4(0,1,0,1);
                  }
                }
                void frag(in float4 pos:POSITION,inout float4 co:COLOR)  //注意需要带上顶点输出的POSITION语义
                {
                }
                ENDCG
            }
        }
    }

方法二:直接返回值

 Shader "a958832776/testinout"
    {
        SubShader
        {
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                 //直接返回颜色
                float4 vert(in float2 objPos:POSITION,out float4 pos:POSITION):COLOR
                {
                     float4 col=float4(0,0,0,0);
                      pos=float4(objPos,0,1);
                      if(pos.x<0){
                        col=float4(1,0,0,1);
                      }
                      else
                      {
                        col=float4(0,1,0,1);
                      }
                      return col;
                }
                void frag(inout float4 co:COLOR)
                {
                }
                ENDCG
            }
        }
    }

方法三:定义结构体

    Shader "a958832776/testinout"
    {
        SubShader
        {
            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                 struct out_data{
                   float4 pos:POSITION;
                   float4 col:COLOR;
                 };

              out_data vert(float2 objPos:POSITION)
                {
                      out_data data;
                      data.pos=float4(objPos,0,1);
                      if(data.pos.x<0){
                        data.col=float4(1,0,0,1);
                      }
                      else
                      {
                        data.col=float4(0,1,0,1);
                      }
                      return data;
                }
                float4 frag(out_data d):COLOR
                {
                  return d.col;
                }
                ENDCG
            }
        }
    }

推荐使用方法三,这样结构更清晰明了,也不会出错。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值