开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:715

当前位置:游戏蛮牛 技术专区 教程分享

查看: 597|回复: 1

[基础知识] unity屏幕空间坐标shader

[复制链接]  [移动端链接]
7日久生情
4317/5000
排名
2397
昨日变化
1

1646

主题

1657

帖子

4317

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
132510
好友
17
蛮牛币
66956
威望
0
注册时间
2015-12-24
在线时间
352 小时
最后登录
2017-6-20
发表于 2016-12-13 16:38:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 BobbyKim 于 2016-12-13 16:37 编辑

屏幕坐标效果不受物体在空间位置的影响,

只受到物体本身和视口的影响,有时候可以做一些特殊效果

比如2D游戏平铺纹理,调试屏幕位置,屏幕特效等等


下面是根据官方例子修改的

http://docs..com/Manual/SL-ShaderSemantics.html


[AppleScript] 纯文本查看 复制代码
Shader "Unlit/Show UVs"  
{    Properties  
{  
    [NoScaleOffset]_MainTex("Texture", 2D) = "white" {}  
}  
SubShader  
{  
    Pass  
{  
    CGPROGRAM  
#pragma vertex vert  
#pragma fragment frag  
#pragma target 3.0  
  
struct v2f {  
    float2 uv : TEXCOORD0;  
    //out float4 outpos2 : SV_POSITION;  
    //float4 pos : SV_POSITION;  
};  
sampler2D _MainTex;  
struct ccc {  
    float4 vertex : POSITION; // vertex position input  
    float2 uv : TEXCOORD0;// first texture coordinate input  
  
};  
  
v2f vert(ccc c,  
    out float4 outpos : SV_POSITION // clip space position output  
    )  
{  
    v2f o;  
    //o.outpos2 = mul(UNITY_MATRIX_MVP, vertex);  
    outpos = mul(UNITY_MATRIX_MVP, c.vertex);  
    o.uv = c.uv;  
    return o;  
  
}  


然后是测试代码

可以通过改动红色代码看到效果

[AppleScript] 纯文本查看 复制代码
Shader "Unlit/Show UVs"  
{    Properties  
{  
    [NoScaleOffset]_MainTex("Texture", 2D) = "white" {}  
}  
SubShader  
{  
    Pass  
{  
    CGPROGRAM  
#pragma vertex vert  
#pragma fragment frag  
#pragma target 3.0  
  
struct v2f {  
    float2 uv : TEXCOORD0;  
    //out float4 outpos2 : SV_POSITION;  
    //float4 pos : SV_POSITION;  
};  
  
sampler2D _MainTex;  
struct ccc {  
    float4 vertex : POSITION; // vertex position input  
    float2 uv : TEXCOORD0;// first texture coordinate input  
  
};  
  
v2f vert(ccc c,  
    out float4 outpos : SV_POSITION // clip space position output  
    )  
{  
    v2f o;  
    outpos = mul(UNITY_MATRIX_MVP, c.vertex);  
    o.uv = c.uv;  
    return o;  
}  
//screenPos.xy就是讲像素点0.5具象化  
//每个格子相当于一个像素 这是其他博主的理解 我再次理解下就是说半像素问题0.5像素是半透明的  
//整个不再边缘的像素才是原本设置的颜色  
//像素坐标的类型是不同的,所以为了方便使用 UNITY_VPOS_TYPE 类型  
  
fixed4 frag(v2f i,  
    UNITY_VPOS_TYPE screenPos : VPOS  
    ) : SV_Target  
{  
//clip(checker);//停止渲染负值部分,0和正的会被渲染  
fixed4 c = fixed4(screenPos.x-2, screenPos.y -2,0,0);  
return c;  
}  
ENDCG  
}  
}  
}  


可以看到如上面设置的时候,在边缘可以看到半透明的红色和绿色的像素线,这个就是


[AppleScript] 纯文本查看 复制代码
screenPos.x  和 screenPos.y的具像化  


其他地方是黄色因为其他地方的值超过了1也就是说绿色和红色都是1,所以加起来是黄色

如果你使用

[AppleScript] 纯文本查看 复制代码
fixed4 c = fixed4(screenPos.x-1 , screenPos.y-1,0,0);  


会看到下面效果(注意这是放大了的结果)



发现有红色和绿色偏移了

但是通过取色,发现颜色并不准确,因为最边缘一个像素会被窗口边界上色(大概)

如果偏移2个像素就会发现中间的一行是正常的颜色


另外说下默认状态可能ps取色有色彩,需要改一下取色器的采样设置


来源于网络



回复

使用道具 举报

5熟悉之中
969/1000
排名
3760
昨日变化
4

0

主题

480

帖子

969

积分

Rank: 5Rank: 5

UID
156480
好友
0
蛮牛币
1594
威望
0
注册时间
2016-7-12
在线时间
179 小时
最后登录
2017-11-27
发表于 2016-12-29 13:23:37 | 显示全部楼层
6666666666

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表