Unity中Shader的屏幕坐标

文章目录


前言

Unity中Shader的屏幕坐标


一、屏幕坐标

1、屏幕像素的坐标

2、屏幕坐标归一化

使用公式: 屏幕归一化坐标 = 当前像素 / 总像素


二、在Unity中获取 当前屏幕像素 和 总像素

1、获取屏幕总像素,使用_ScreenParams参数

_ScreenParams

屏幕的相关参数,单位为像素。

x表示屏幕的宽度

y表示屏幕的高度

z表示1+1/屏幕宽度

w表示1+1/屏幕高度

2、获取当前片段上的像素

UNITY_VPOS_TYPE screenPos : VPOS

1.当前片断在屏幕上的位置(单位是像素,可除以_ScreenParams.xy来做归一化),此功能仅支持#pragma target 3.0及以上编译指令

2.大部分平台下VPOS返回的是一个四维向量,部分平台是二维向量,所以需要用UNITY_VPOS_TYPE来统一区分.

3.在使用VPOS时,就不能在v2f中定义SV_POSITION,这样会冲突,所以需要把顶点着色器的输入放在()的参数中,并且SV_POSITION添加out.

怎么使用:在片元着色器传入参数时使用

fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target

{

}

VPOS这个类型因为在不同平台不统一,有的是 float2 有的是 float4 ,所以使用Unity提供的类型 UNITY_VPOS_TYPE,让Unity自动处理

当使用UNITY_VPOS_TYPE screenPos : VPOS作为片元着色器的输入时,需要对顶点着色器的输入做出修改

修改后代码:

复制代码
Shader "MyShader/P0_10_3"
{
    SubShader
    {
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f
            {
                float2 uv : TEXCOORD0;
            };
            //在顶点着色器的输入处,不用appdata,直接使用用到的参数,防止 SV_POSITION 重复定义
            v2f vert (
                float4 vertex : POSITION,
                out float4 pos : SV_POSITION
            )
            {
                v2f o;
                pos = UnityObjectToClipPos(vertex);
                return o;
            }

            fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target
            {
                
                float2 screenUV = screenPos.xy / _ScreenParams.xy;
                return fixed4(screenUV,0,0);
            }
            ENDCG
        }
    }
}

效果:

输出屏幕归一化的x的效果:return screenUV.x;

输出屏幕归一化的y的效果:return screenUV.y;

相关推荐
林川~0115 分钟前
Unity新输入系统使用笔记
unity·input system
小贺儿开发8 小时前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
goujunwe11 小时前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
林川~0120 小时前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
yi碗汤园1 天前
MQTT消息队列遥测传输协议
网络·网络协议·unity
林川~011 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api
sensen_kiss1 天前
CPT306 Coursework 1 个人游戏作业——坦克大战
unity·游戏程序·游戏策划
蒸鱼Yuzheng1 天前
Unity 与 Unreal 测试工具怎么回答:Profiler、日志、自动化与证据链
测试工具·unity·性能分析·游戏测试·unrealengine
野区捕龙为宠1 天前
Unity WebGL平台 通过 URL 加载图片(UGUI RawImage / 模型材质)
unity·团结引擎
阿松爱学习2 天前
【Unity开发】FileStream 详解及用法指南
unity·c#·unity开发