Unity透视镜透视效果——Shader

一、效果示意图

请添加图片描述

二、透视的过程

要看的效果:【相机】借助【球体】,透过【圆柱】看到【红色的方块】
在这里插入图片描述
请添加图片描述

三、实现原理-Shader

借助shader,两个挂有特殊shader的物体,当他们在视线里重叠的时候,重叠的部分变成透明。

shder清单见附录部分

(1)透镜的shader设置

在这里插入图片描述

(2)障碍物的shader设置

在这里插入图片描述

四、附录-shader清单

(1)透镜挂在的shader

Shader "Custom/MaskShader4"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)  // 添加颜色属性
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Geometry-1" }
        ColorMask 0
        ZWrite Off
        
        Stencil
        {
            Ref 1
            Comp Always
            Pass Replace
        }
        CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        fixed4 _Color;  // 声明颜色变量

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;  // 应用颜色
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

(2)障碍物挂在的shader

Shader "Custom/MaskedObjectShader4"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)  // 添加颜色属性
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Geometry" }
        
        Stencil
        {
            Ref 1
            Comp NotEqual
            Pass Keep
        }

        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        fixed4 _Color;  // 声明颜色变量

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;  // 应用颜色
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

五、鸣谢

感谢chatGpt公公和Claude婆婆的慷慨大方

### Unity 坐标系下物体意外显示为圆球的原因 在Unity中,当物体意外显示为圆球时,通常涉及几个可能的因素: - **缩放比例不一致**:如果对象的Transform组件中的Scale属性设置不当,可能会导致原本不是圆形的对象被拉伸成接近圆形的样子。例如,在某些情况下,X轴、Y轴和Z轴的比例不同会使得矩形体看起来像椭圆或圆球[^1]。 - **网格数据错误**:导入的模型文件可能存在顶点位置或其他几何信息上的问题,这可能导致渲染器无法正确解释其形状而将其呈现为近似于球体的形式。这种情形较少见但也有可能发生。 - **材质与着色器配置失误**:特定类型的Shader(如带有强烈高光反射特性的Shader),或者Material参数调整失当也可能造成视觉上看似“圆润”的效果。特别是当应用了具有特殊光照计算逻辑的自定义Shader之后,比如尝试模拟内发光效果却误用了其他参数,则容易引发此类现象。 - **摄像机投影模式影响**:正交相机和平行透视之间的切换也会影响场景内的物体外观;特别是在使用非标准视图角度的情况下,一些细长结构会被压缩变形成为更紧凑甚至近乎圆形的模样。 针对上述情况的具体解决方案如下: #### 解决方案一:检查并修正变换矩阵 确保所有目标GameObject在其Transform组件下的Local Scale字段均为(1, 1, 1),即保持均匀缩放状态。对于那些确实需要异向缩放的情况,请谨慎操作,并测试不同的数值组合来找到最合适的表示方式。 #### 解决方案二:验证资产质量 重新审查所使用的3D模型资源,确认它们本身不存在结构性缺陷。可以考虑通过第三方建模软件打开这些文件来进行初步排查,必要时修复损坏部分后再导回项目工程目录里继续开发工作流程。 #### 解决方案三:优化材料设定 仔细核对当前绑定给该物件表面覆盖层的各项物理特性描述符——包括但不限于颜色贴图(Color Map)、法线映射(Normal Mapping)以及环境遮蔽(Ambient Occlusion)等高级选项。同时也要留意是否存在不必要的后期处理特效叠加干扰正常表现力的情形存在。 #### 解决方案四:评估视角因素 最后但同样重要的是要考虑到观察者所在的位置及其对应的镜头焦距范围变化所带来的潜在副作用。适当调节Camera GameObject的相关属性值有助于缓解因投影视角差异引起的空间扭曲效应。 ```csharp // C#脚本用于调试目的,帮助检测是否有异常缩放 using UnityEngine; public class DebugObjectScaling : MonoBehaviour { void Update() { Vector3 scale = transform.localScale; if (scale.x != 1 || scale.y != 1 || scale.z != 1){ Debug.LogWarning($"Detected non-uniform scaling on object {name}: ({scale.x}, {scale.y}, {scale.z})"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值