(十)计算机图形学 之 Shader2.0 outline (轮廓 描边)

轮廓做法:

 

1. 直接 渲染两个 物体,(一个大 一个小,大的是轮廓 直接返回颜色,小的是实际图片颜色)
需要多个Pass 
2. 渲染物体轮廓 (第一步:找到轮廓 ,第二步:给边缘着色 ,第三步:非边缘正常纹理采样)
需要法线知识(越到边缘 与 视角的法线 的夹角越小)

下面介绍下 多个Pass 描边 (第一种做法):

ZTest Always  // 深度测试代码贴上:

Shader "Custom/OUtLine" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _OutLineWidth("LineWidth",float) = 1.1
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        // 一个Pass 渲染一遍 有几个渲染几次
        Pass {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                struct appdata {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                };


                struct v2f {
                    float4 vertex : SV_POSITION;
                    float2 uv : TEXCOORD0;
                };
                float _OutLineWidth;
                v2f vert (appdata v)
                {
                    v2f o;
                    v.vertex.xy *= _OutLineWidth;
                    o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.uv = v.uv;
                    return o;
                }
                sampler2D _MainTex;
                fixed4 frag (v2f i) : SV_Target
                {
                    fixed4 col = tex2D(_MainTex,i.uv);
                    //return col;
                    return fixed4(1,0,0,1);  // 描边颜色
                }
            ENDCG 
        }
        
        Pass {
        
            ZTest Always  // 深度测试
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };


            struct v2f {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = v.uv;
                return o;
            }
            sampler2D _MainTex;
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex,i.uv);
                return col;  // 实际贴图
                //return fixed4(0,1,0,1);
            }
            ENDCG 
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: Shader outline是一种在渲染物体时给其轮廓添加特殊效果的技术。根据引用\[1\]中的说明,可以通过改进代码来实现轮廓外发光(光晕)效果。而根据引用\[2\]中的介绍,渲染物体轮廓需要多个Pass,其中包括找到轮廓、给边缘着色和非边缘正常纹理采样等步骤。此外,根据引用\[3\]中的原理,描边通道会将模型沿法线方向向外挤出一定的大小,并在膨胀后的模型的内表面贴上轮廓颜色的纹理。最后,可以在原来模型的基础上再绘制一次diffuse等其他通道的计算结果。因此,shader outline可以通过这些步骤和原理来实现。 #### 引用[.reference_title] - *1* *3* [【shaderforge学习笔记】 OutLine(外描边)通道](https://blog.csdn.net/v_xchen_v/article/details/79174987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [(计算机图形学Shader2.0 outline轮廓 描边)](https://blog.csdn.net/u013774978/article/details/129828229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GarFe-Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值