请问Unity3D如何穿透ios 点击事件穿透,就是人物死亡后有个半透明层??

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
_____________________________________________________________________________________________________________
问答求助版块规则:
  1、问题尽量描述清楚
& && &2、代码要放在代码块里
& && &3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
& && &5、问题得到解决,请选择最佳答案。
& && &6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 412|回复: 8
unity 关于监测是否有网络相关问题
5565/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
在线时间216 小时
&&if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork)
& && && && &text.text = &当前有网络&;
& && &&&}现在出现以上代码在unity中没打包之前 可以监测是否有网络接入,但是打包完毕之后不管有没有网络接入它都显示有网络接入 求大神指教怎么调整
每日推荐:
5685/1000排名<font color="#FF昨日变化2主题帖子积分
熟悉之中, 积分 685, 距离下一级还需 315 积分
熟悉之中, 积分 685, 距离下一级还需 315 积分
在线时间262 小时
本帖最后由 MNSuZhen 于
14:30 编辑
Application.internetReachability 网络可达性
JavaScript => static var internetReachability: NetworkR
C# => static NetworkReachability internetR
Description 描述
Returns the type of Internet reachability currently possible on the device.
返回设备上的网络可达性目前可能的类型。
This property is mostly useful on handhelds to distinguish fast and cheap WiFi connection from carrier networking.
此属性是在手持设备上区分运营商网络快速而廉价的WiFi连接最有用。
Note: Do not use this property to determine the actual connectivity. E.g. the device can be connected to a hot spot, but not have the actual route to the network. Non-handhelds are considered to always be capable of NetworkReachability.ReachableViaLocalAreaNetwork.
注意,请不要使用此属性来确定实际的连接。例如该设备可以连接到一个热点,但不具有连网络的实际路由。非手持设备被认为总是能够联网NetworkReachability.ReachableViaLocalAreaNetwork。
非手持设备被认为总是能够联网
非手持设备被认为总是能够联网
非手持设备被认为总是能够联网
请问,你测试用的设备是手持设备吗
[]: MNSuZhen 发帖时在路边捡到 2
蛮牛币,偷偷放进了口袋.
每日推荐:
5565/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
在线时间216 小时
Application.internetReachability 网络可达性
您好 我发布的就是一个普通的PC版demo
每日推荐:
5565/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
在线时间216 小时
您好 我发布的就是一个普通的PC版demo
好的&&我知道了&&谢谢&&在冒昧问下 PC上有解决方法判断是否有网络嘛
[]: 1235645 发帖时在路边捡到 1
蛮牛币,偷偷放进了口袋.
每日推荐:
5565/1000排名<font color="#FF昨日变化主题帖子积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
熟悉之中, 积分 565, 距离下一级还需 435 积分
在线时间216 小时
您好 我发布的就是一个普通的PC版demo
请问 有好的办法在PC上判断是否有网络接入嘛
[]: 1235645 乐于助人,奖励 1
每日推荐:
5685/1000排名<font color="#FF昨日变化2主题帖子积分
熟悉之中, 积分 685, 距离下一级还需 315 积分
熟悉之中, 积分 685, 距离下一级还需 315 积分
在线时间262 小时
好的&&我知道了&&谢谢&&在冒昧问下 PC上有解决方法判断是否有网络嘛
https://www.cnblogs.com/kevinGao/archive//2270750.html
每日推荐:
5510/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 510, 距离下一级还需 490 积分
熟悉之中, 积分 510, 距离下一级还需 490 积分
在线时间158 小时
[]: SrMao_e432t 发帖时在路边捡到 2
蛮牛币,偷偷放进了口袋.
每日推荐:
5858/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 858, 距离下一级还需 142 积分
熟悉之中, 积分 858, 距离下一级还需 142 积分
蛮牛币1608
在线时间271 小时
每日推荐:
118/50排名<font color="#FF昨日变化9主题帖子积分
注册看看, 积分 18, 距离下一级还需 32 积分
注册看看, 积分 18, 距离下一级还需 32 积分
在线时间7 小时
模拟器反正就会出些网络连接的幺蛾子
每日推荐:扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 23060|回复: 972
【2016年12月训练营】开撸3D超级玛丽,你准备好了吗?
16排名<font color="#FF昨日变化主题帖子积分
蛮牛币5142
在线时间2028 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 仅为年时 于
10:53 编辑
mario1.png (540.17 KB, 下载次数: 9)
16:30 上传
要求:基本:1、实现角色的控制,包括跑、跳、前后左右朝向。2、实现怪物AI,自动寻找主角。3、实现金币拾取,包括拾取后的消失特效。
高级:1、UI界面的创建,包括游戏的开始、退出、暂停等。2、完善游戏并优化,实现背景音乐,角色跳跃、死亡、撞击等音乐,怪物攻击音乐;实现场景中踏板、金币等的路径移动或者旋转;实现视频播放等等等等。
说明:1、回帖提供“可执行文件”“内容源码文件”及“运行效果图”;
2、活动时间为一个月,可视参与情况延长活动时长;
1、优秀奖1名:1个月蛮牛教育VIP权利,享受免费课程与VIP级别课程1个月免费观看权;
2、参与奖2名:蛮牛币100个;
3D超级玛丽出制作课程啦,想学习的赶紧喽!!!(工程源码在视频第五节后面)
===================================================================
12月训练营活动已圆满结束,非常感谢大家对活动的支持,希望大家继续关注蛮牛此类活动。大家也可以到各楼层下载demo学习研究。
用户sconi(所在楼层沙发)获得优秀奖,奖励1个月蛮牛教育VIP权力,享受免费课程与VIP级别课程1个月免费观看权。(已发放)
用户ashu(所在楼层321)、用户wzhhh(所在楼层636)获得参与奖,奖励蛮牛币100个。(已发放)
向他们表示祝贺!
===================================================================
玛丽资源下载(包括玛丽怪物模型、场景物品模型以及贴图等)(大家不要说没有模型资源了,都在里面的mesh文件夹下,是max格式的,新版本unity可以直接导入,只不过有点慢,如果不太好用大家可以自行到3DMAX中转换为fbx格式后来用):游客,如果您要查看本帖隐藏内容请链接:
密码:g370& && &&&( 有点大,因为资源是网上一个资源下载下来的,里面还有比较多没有用上的资源)
楼主自制demo(exe文件,制作视频见蛮牛教育):链接:
密码: rhxf
1.gif (7.89 MB, 下载次数: 13)
16:16 上传
2.gif (7.89 MB, 下载次数: 10)
16:17 上传
3.gif (6.79 MB, 下载次数: 8)
16:18 上传
资源的原始名字叫:Walker Boys Studio - 3D.
每日推荐:
2103/150排名<font color="#FF昨日变化6主题帖子积分
初来乍到, 积分 103, 距离下一级还需 47 积分
初来乍到, 积分 103, 距离下一级还需 47 积分
在线时间73 小时
本帖最后由 wzhhh 于
15:28 编辑
可执行文件
链接:http://pan.baidu.com/s/1qYPdCKW
密码:9z4z
补发项目工程
链接:http://pan.baidu.com/s/1dFBmWiX
密码:g370& && &&&( 有点大,因为资源是网上一个资源下载下来的,里面还有比较多没有用上的资源)
内容源码文件是什么东西,是项目文件吗,楼主大大回复一下再补发
楼主的资源实在不会用,或者我电脑太差了搞了好久都不能用,资源是网上下载的,地形什么的比较简单就自己搞了,UI有的是图标下载的有的是p的,
实现了基本的功能,做的比较粗糙,碰撞器什么的都没认真调,可能体验不太好,也就这样了,明天开始准备预习期末考试了哈哈哈。
(326.39 KB, 下载次数: 9)
22:23 上传
(341.26 KB, 下载次数: 6)
22:23 上传
(417.06 KB, 下载次数: 6)
22:23 上传
(504.13 KB, 下载次数: 5)
22:23 上传
(206.93 KB, 下载次数: 5)
22:23 上传
组图打开中,请稍候......
对的,就是项目源码工程&
[]: wzhhh 捡了钱没交公 蛮牛币 降了 2
每日推荐:
293/150排名<font color="#FF昨日变化2主题帖子积分
初来乍到, 积分 93, 距离下一级还需 57 积分
初来乍到, 积分 93, 距离下一级还需 57 积分
在线时间30 小时
本帖最后由 ashu 于
14:29 编辑
本来准备12月31号完成,结果元旦刚了一波.
基本功能都实现, 动作用官方Demo,+Mario的骨骼模型,少了很多动作
因为还不会用Animation.
两个地方,视频播放没有声音,不会自动循环播放
金币砖块没有做,
第一次有完整的开始,结束界面.
游戏包链接: https://pan.baidu.com/s/1eSqSRi6 密码: qejg
Asset到了800M,只是做出来,不知道什么是优化,https://pan.baidu.com/s/1sljKWqx
jdfw1.gif (910.96 KB, 下载次数: 2)
08:15 上传
jdfw2.gif (814.11 KB, 下载次数: 2)
08:15 上传
jdfw4.gif (491.52 KB, 下载次数: 2)
08:15 上传
jdfw5.gif (789.99 KB, 下载次数: 1)
08:16 上传
每日推荐:
9排名<font color="#FF昨日变化1主题帖子积分
蛮牛币2169
在线时间700 小时
本帖最后由 sconi 于
09:27 编辑
[fly]12,12节日发布[/fly]
基础功能已制作完成,包括UI,怪物触发,金币触发,事件触发,简单场景,插件使用的DOtween,ProBuidle。
自写脚本目录是:_MarioPack/Script 分控制,物品,触发和UI。人物控制以及怪物脚本使用项目自带JS。
资源和我做的混合在一起了,没有整理。做得比较匆忙,脚本好多没有注释,主要原因是“我水平有限”,没养成好习惯。呵呵。
这是第一次具体尝试设计一款游戏,感受到前期策划,场景设计是游戏趣味性的保证,边想边做会有很多BUG等待处理。
//百度云经常抽风,又再次更新链接地址
编译好的:(百度云)
https://pan.baidu.com/s/1gfn2mC7
项目资源:(百度云)
https://pan.baidu.com/s/1bpKe1yB
另附上,金币计分图片显示代码:
博文链接:
CrossFadeAlpha.gif (1.06 MB, 下载次数: 4)
17:56 上传
过关秘籍:
(1.65 MB, 下载次数: 10)
14:24 上传
不错不错,蛮牛的博客也改版了,可以考虑考虑来蛮牛写博客奥&
每日推荐:
16排名<font color="#FF昨日变化主题帖子积分
蛮牛币5142
在线时间2028 小时
留名留作品,才是王道
每日推荐:
4371/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 371, 距离下一级还需 129 积分
四处流浪, 积分 371, 距离下一级还需 129 积分
在线时间114 小时
回复一下拿资料
每日推荐:
72298/5000排名<font color="#FF昨日变化2主题帖子积分
日久生情, 积分 2298, 距离下一级还需 2702 积分
日久生情, 积分 2298, 距离下一级还需 2702 积分
蛮牛币7052
在线时间704 小时
回复看看~~~~~~
每日推荐:
4371/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 371, 距离下一级还需 129 积分
四处流浪, 积分 371, 距离下一级还需 129 积分
在线时间114 小时
楼主给套模型呗
每日推荐:
16排名<font color="#FF昨日变化主题帖子积分
蛮牛币5142
在线时间2028 小时
楼主给套模型呗
帖子里有,所有怪物什么的模型都在里面
[]: 一个袋子砸在了 仅为年时 头上,仅为年时 赚了 1
每日推荐:
3155/300排名<font color="#FF昨日变化2主题帖子积分
偶尔光临, 积分 155, 距离下一级还需 145 积分
偶尔光临, 积分 155, 距离下一级还需 145 积分
在线时间44 小时
回复拿资料
每日推荐:
118/50排名<font color="#FF昨日变化4主题帖子积分
注册看看, 积分 18, 距离下一级还需 32 积分
注册看看, 积分 18, 距离下一级还需 32 积分
在线时间7 小时
回复一下拿作品
[]: b0607012 在网吧通宵,花了 2
每日推荐:
71958/5000排名<font color="#FF昨日变化7主题帖子积分
日久生情, 积分 1958, 距离下一级还需 3042 积分
日久生情, 积分 1958, 距离下一级还需 3042 积分
蛮牛币4254
在线时间485 小时
下下来看看
每日推荐:
3156/300排名<font color="#FF昨日变化2主题帖子积分
偶尔光临, 积分 156, 距离下一级还需 144 积分
偶尔光临, 积分 156, 距离下一级还需 144 积分
在线时间54 小时
赞一个,可以试试
每日推荐:
5594/1000排名<font color="#FF昨日变化4主题帖子积分
熟悉之中, 积分 594, 距离下一级还需 406 积分
熟悉之中, 积分 594, 距离下一级还需 406 积分
在线时间509 小时
{:94:}啦啦啦....
每日推荐:
4346/500排名<font color="#FF昨日变化1主题帖子积分
四处流浪, 积分 346, 距离下一级还需 154 积分
四处流浪, 积分 346, 距离下一级还需 154 积分
在线时间153 小时
回复一下拿资料
[]: 一个袋子砸在了 majijun108 头上,majijun108 赚了 1
每日推荐:
282/150主题帖子积分
初来乍到, 积分 82, 距离下一级还需 68 积分
初来乍到, 积分 82, 距离下一级还需 68 积分
在线时间39 小时
good.................................
每日推荐:
259/150排名<font color="#FF昨日变化7主题帖子积分
初来乍到, 积分 59, 距离下一级还需 91 积分
初来乍到, 积分 59, 距离下一级还需 91 积分
在线时间35 小时
顶顶顶顶顶顶顶顶顶顶顶
每日推荐:
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号
经过游戏蛮牛认证的蛮牛小翻译
社区QQ达人
使用QQ帐号登录论坛的用户
连续签到30天
七夕浪漫情人
2015年蛮牛社区浪漫七夕 最美情话活动获奖者
原创精华达人
原创精华帖子总数量 ≥ 100
论坛发帖强人
主题帖子总数量 ≥ 500
在“新人报到 ”版块发过自己的照片
认证开发者
经过游戏蛮牛认证的独立开发者
购买游戏蛮牛书籍Unity3D Shader 入门
发布时间: 10:26:31
什么是Shader
Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。OpenGL的着色语言是GLSL, NVidia开发了Cg,而微软的Direct3D使用高级着色器语言(HLSL)。而Unity的Shader 是将传统的图形接口的Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实现跨平台。
Unity Shader 其实并不难,初学者往往很迷惑是因为它有太多固定的命令和结构,而这些命令又需要我们对3D渲染有一定的了解才能知道它们是做什么的。
Shader种类
OpenGL和Direct3D都提供了三类着色器:
顶点着色器:处理每个顶点,将顶点的空间位置投影在屏幕上,即计算顶点的二维坐标。同时,它也负责顶点的深度缓冲(Z-Buffer)的计算。顶点着色器可以掌控顶点的位置、颜色和纹理坐标等属性,但无法生成新的顶点。顶点着色器的输出传递到流水线的下一步。如果有之后定义了几何着色器,则几何着色器会处理顶点着色器的输出数据,否则,光栅化器继续流水线任务。 像素着色器(Direct3D),常常又称为片断着色器(OpenGL):处理来自光栅化器的数据。光栅化器已经将多边形填满并通过流水线传送至像素着色器,后者逐像素计算颜色。像素着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。名称片断着色器似乎更为准确,因为对于着色器的调用和屏幕上像素的显示并非一一对应。举个例子,对于一个像素,片断着色器可能会被调用若干次来决定它最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。 几何着色器:可以从多边形网格中增删顶点。它能够执行对CPU来说过于繁重的生成几何结构和增加模型细节的工作。Direct3D版本10增加了支持几何着色器的API, 成为Shader Model 4.0的组成部分。OpenGL只可通过它的一个插件来使用几何着色器。
Unity Shader 分为 表面着色器(Surface Shader)和 顶点片段着色器(Vertex And Fragment Shader)。
表面着色器(Surface Shader)是Unity提出的一个概念。编写着色器与光照的交互是复杂的,光源有很多类型,不同的阴影选项,不同的渲染路径(正向和延时渲染),表面着色器将这一部分简化。Unity建议使用表面着色器来编写和光照有关的Shader。 顶点片段着色器(Vertex And Fragment Shader)和OpenGL,Direct3D中的顶点着色器和片段着色器没有什么区别。顶点片段着色器比表面着色器使用更自由也更强大,当然光照需要自行处理。Unity也允许在里面编写几何着色器,一般用得不多。
Shader程序结构
Shader语法:
//Shader语法: Shader "name" { [Properties] Subshaders [Fallback] [CustomEditor] }
//Properties 语法 Properties { Property [Property ...] }
// Subshader 语法 Subshader { [Tags] [CommonState] Passdef [Passdef ...] }
// Pass 语法 Pass { [Name and Tags] [RenderSetup] }
// Fallback 语法 Fallback "name"
属性定义(Property Definition):定义Shader的输入,这些输入可以在材质编辑的时候指定 子着色器(SubShader):一个Shader可以有多个子着色器。这些子着色器互不相干且只有一个会在最终的平台运行。编写多个的目的是解决兼容性问题。Unity会自己选择兼容终端平台的Shader运行。 回滚(Fallback):如果子着色器在终端平台上都无法运行,那么使用Fallback指定的备用Shader,俗称备胎。 Pass:一个Pass就是一次绘制。对于表面着色器,只能有一个Pass,所以不存在Pass节。顶点片段着色器可以有多个Pass。多次Pass可以实现很多特殊效果,例如当人物被环境遮挡时还可以看到人物轮廓就可以用多Pass来实现。 Cg代码:每个Pass中都可以包含自定义的Cg代码,从CGPROGRAM开始到ENDCG结束。
基本的表面着色器示例:
Shader "Custom/NewShader" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
SubShader {
Tags { "RenderType" = "Opaque" }
#pragma surface surf Lambert
sampler2D _MainT
struct Input {
float2 uv_MainT
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.
o.Alpha = c.a;
FallBack "Diffuse"
基本的顶点片段着色器示例:
Shader "VertexInputSimple" {
SubShader {
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
fixed4 color : COLOR;
v2f vert (appdata_base v)
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.color.xyz = v.normal * 0.5 + 0.5;
o.color.w = 1.0;
fixed4 frag (v2f i) : SV_Target { return i. }
Shader 输入
Shader的输入有两个来源,一是通过属性定义,一是通过Shader.SetGlobalXXX方法全局设置。
属性定义变量:属性定义中的变量是Shader参数的主要设置方式。 它是随材质变化的,每个使用该Shader的材质都可以在Inspector或者脚本中设置这些参数。这些参数除了在Shader的Properties段中定义外,还需要在Cg中声明方可使用。例如上面表面着色器的例子中我们定义了_MainTex这个类型为2D的属性,还需要在Cg中声明 sampler2D _MainTex。 全局变量:Shader有一组SetGlobalXXX方法,可以对Shader的在Cg中定义而没有在属性中定义的uniform变量进行设置。这个设置是全局的,所有定义了该uniform的Shader都会受到影响。例如我们希望场景随着时间变化而改变颜色,就可以给场景所使用到的Shader设置统一的全局颜色变量,然后在脚本中通过设置该颜色来改变场景的颜色。在角色释放技能时场景变黑也可以使用这个方法。
Unity shader 中允许定义的属性类型有:
对应Cg类型
_MyFloat (“My float”, Float) = 0.5
浮点数 (在指定范围内)
_MyRange (“My Range”, Range(0.01, 0.5)) = 0.1
浮点四元组
_MyColor (“Some Color”, Color) = (1,1,1,1)
浮点四元组
_MyVector(“Some Vector”,Vector)
= (1,1,1,1)
2的阶数大小的贴图
_MyTexture (“Texture”, 2D) = “white” {}
非2的阶数大小的贴图
_MyRect(“My Rect”, Rect) = “white” {}
samplerCUBE
_MyCubemap (“Cubemap”, CUBE) = “” {}
注:CubeMap 是6张有联系的2D贴图的组合主要用来做反射效果(比如天空盒和动态反射)
SubShader中除了Pass,有两个标签值得关注:LOD和Tags
LOD是 Level of Detail的简写,确切地说是Shader Level of Detail的简写,因为Unity中还有一个模型的LOD概念,这是两个不同的东西。我们这里只介绍Shader中LOD,模型的LOD请。
Shader LOD 就是让我们设置一个数值,这个数值决定了我们能用什么样的Shader。可以通过Shader.maximumLOD或者Shader.globalMaximumLOD 设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。通过LOD,我们就可以为某个材质写一组SubShader,指定不同的LOD,LOD越大则渲染效果越好,当然对硬件的要求也可能越高,然后根据不同的终端硬件配置来设置 globalMaximumLOD来达到兼顾性能的最佳显示效果。
Unity内建Shader定义了一组LOD的数值,我们在实现自己的Shader的时候可以将其作为参考来设定自己的LOD数值
VertexLit及其系列 = 100 Decal, Reflective VertexLit = 150 Diffuse = 200 Diffuse Detail, Reflective Bumped Unlit, Reflective Bumped VertexLit = 250 Bumped, Specular = 300 Bumped Specular = 400 Parallax = 500 Parallax Specular = 600
SubShader可以被若干的标签(tags)所修饰,而硬件将通过判定这些标签来决定什么时候调用该着色器。
比较常见的标签有:
这个标签很重要,它定义了一个整数,决定了Shader的渲染的次序,数字越小就越早被渲染,早渲染就意味着可能被后面渲染的东西覆盖掉看不见。
预定义的Queue有:
Background
最早被调用的渲染,用来渲染天空盒或者背景
这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)
用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑
Transparent
以从后往前的顺序渲染透明物体
用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)
RenderType
“Opaque”或”Transparent”是两个常用的RenderType。如果输出中都是非透明物体,那写在Opaque里;如果想渲染透明或者半透明的像素,那应该写在Transparent中。这个Tag主要用,一般情况下这Tag好像也没什么作用。
CommonState
SubShader中可以定义一组Render State,基本上就是一些渲染的开关选项,他们对该SubShader的所有的Pass都有效,所以称Common。这些Render State也可以在每个Pass中分别定义,将在Pass中详细介绍。
Render State
Render State主要就是控制渲染过程的一些开关选项,例如是否开启alpha blending ,是否开启depth testing。
常用的Render State有:
用法:Cull Back | Front | Off
多边形表面剔除开关。Back表示背面剔除,Front表示正面剔除,Off表示关闭表面剔除即双面渲染。有时候如裙摆,飘带之类很薄的东西在建模时会做成一个面片,这就需要设置Cull Off来双面渲染,否则背面会是黑色。 ZWrite
用法:ZWrite On | Off
控制当前对象的像素是否写入深度缓冲区(depth buffer),默认是开启的。一般来说绘制不透明物体的话ZWrite开启,绘制透明或半透明物体则ZWrite关闭。
深度缓冲区:当图形处理卡渲染物体的时候,每一个所生成的像素的深度(即 z 坐标)就保存在一个缓冲区中。这个缓冲区叫作 z 缓冲区或者深度缓冲区,这个缓冲区通常组织成一个保存每个屏幕像素深度的 x-y 二维数组。如果场景中的另外一个物体也在同一个像素生成渲染结果,那么图形处理卡就会比较二者的深度,并且保留距离观察者较近的物体。然后这个所保留的物体点深度保存到深度缓冲区中。最后,图形卡就可以根据深度缓冲区正确地生成通常的深度感知效果:较近的物体遮挡较远的物体。
理解了深度缓冲区也就理解了为什么绘制透明或半透明物体需要关闭ZWrite, 如果不关闭,透明物体的depth也会被写入深度缓冲区,从而会剔除掉它后面的物体,后面的物体就不会被渲染,看不见后面的物体还能叫透明吗?因此我们使用Alpha blending的时候需要设置ZWrite Off。 ZTest
用法:ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
控制如何进行深度测试,也就是上面说的图形处理卡比较二者的深度的比较方法。默认是LEqual。
值得一提的是使用Aplha blending的时候ZWrite需要关闭但是ZTest是要开启的,因为如果透明物体前面还有不透明物体,透明物体还是应该被遮挡剔除的。 Blend
混合。控制了每个Shader的输出如何和屏幕上已有的颜色混合。
Blend Off: 关闭混合
Blend SrcFactor DstFactor:最终颜色 = Shader产生的颜色 × SrcFactor + 屏幕上原来的颜色 × DstFactor
Blend SrcFactor DstFactor, SrcFactorA DstFactor:和上面一样,只是Alpha通道使用后面两个参数计算
常用的Blend模式有:
Blend SrcAlpha OneMinusSrcAlpha // Alpha blending
Blend One One // Additive
Blend OneMinusDstColor One // Soft Additive
Blend DstColor Zero // Multiplicative
Blend DstColor SrcColor // 2x Multiplicative
Unity5开始下列固定功能的Shader命令被标记为过时了,这些命令的功能现在建议在Shader(Cg)中通过代码来实现,这里列出是为了方便阅读以前写的Shader:
Lighting On | Off Material { Material Block } SeparateSpecular On | Off Color Color-value ColorMaterial AmbientAndDiffuse | Emission Fog { Fog Block } AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue SetTexture textureProperty { combine options }
Surface Shader
Surface Shader 隐藏了很多光照处理的细节,它的设计初衷是为了让用户仅仅使用一些指令(#pragma)就可以完成很多事情,并且封装了很多常用的光照模型和函数。相比底层的Vertex And Fragment Shader,Suface Shader的限制比较多,它只能有一次Pass。如果做一些常规的功能又需要光照,可以用Surface Shader写,比较快速便捷。如果要写比较高级的Shader还是建议使用Vertex Shader 和 Fragment Shader。
Surface Shader主要有两部分组成,一个是#pragma后面的指令,一个是surf函数。
pragma的语法是 #pragma surface surfaceFunction lightModel [optionalparams]
- surfaceFunction 通常就是名为surf的函数, 函数名可以自己取
surf函数原型是:void surf (Input IN, inout SurfaceOutput o)
- lightModel是Unity内置的光照模型,可以是Lambert,Blinn-Phong等。
- optionalparams: 包含很多指令
surf函数主要有一个Input结构的输入和SurfaceOutput结构的输出。
Input 结构需要在Shader中定义。它可以包含如下字段, 如果你定义了这些字段就可以在surf函数中使用它们(好神奇的黑科技)
多个贴图的uv坐标,名字必须符合格式uv+贴图名。例如 float2 uv_MainTex float3 viewDir - 视图方向( view direction)值。为了计算视差效果(Parallax effects),边缘光照(rim lighting)等,需要包含视图方向( view direction)值。 float4 with COLOR semantic - 每个顶点(per-vertex)颜色的插值。 float4 screenPos - 屏幕空间中的位置。 为了反射效果,需要包含屏幕空间中的位置信息。比如在Dark Unity中所使用的 WetStreet着色器。 float3 worldPos - 世界空间中的位置。 float3 worldRefl - 世界空间中的反射向量。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。 请参考这个例子:Reflect-Diffuse 着色器。 float3 worldNormal - 世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。 float3 worldR INTERNAL_DATA - 世界空间中的反射向量。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。 float3 worldN INTERNAL_DATA -世界空间中的法线向量(normal vector)。如果表面着色器(surface shader)不写入法线(o.Normal)参数,将包含这个参数。
SurfaceOutput
SurfaceOutput 描述了表面的特性(光照的颜色反射率、法线、散射、镜面等),这个结构是固定的,不需要在Shader中再定义。
struct SurfaceOutput {
//反射率,一般就是在光照之前的原始颜色
//自发光,用于增强物体自身的亮度,使之看起来好像可以自己发光
Unity5 由于引入了基于物理的光照模型,所以新增加了两个Output
struct SurfaceOutputStandard {
fixed3 Albedo;
// base (diffuse or specular) color
fixed3 Normal;
// tangent space normal, if written
half3 Emission;
half Metallic;
// 0=non-metal, 1=metal
half Smoothness;
// 0=rough, 1=smooth
half Occlusion;
// occlusion (default 1)
fixed Alpha;
// alpha for transparencies }; struct SurfaceOutputStandardSpecular {
fixed3 Albedo;
// diffuse color
fixed3 Specular;
// specular color
fixed3 Normal;
// tangent space normal, if written
half3 Emission;
half Smoothness;
// 0=rough, 1=smooth
half Occlusion;
// occlusion (default 1)
fixed Alpha;
// alpha for transparencies };
Unity提供了一些基本的SurfaceShader的例子,有助于我们理解输入输出是如何被使用的。
Vertex Shader
如果不想使用Surface Shader而直接编写opengl和Direct3D中常见的顶点着色器和片段着色器,可以通过Cg代码段嵌入到Pass中:
// ... the usual pass state setup ...
// compilation directives for this snippet, e.g.:
#pragma vertex vert
#pragma fragment frag
// the Cg/HLSL code itself
// ... the rest of pass setup ...
其中vert就是顶点着色器函数,frag就是片段着色器函数。一般来说,可以在顶点着色器中进行的计算就不应该放到片段着色器中去算,因为顶点着色器是逐顶点计算的而片段着色器是逐像素计算的,一个模型顶点总比表明像素少很多吧。
编写顶点和片段着色器一般需要包含Unity预定义的一个帮助文件UnityCG.cginc,里面预定义了一些常用的结构和方法。版Unity这个文件位于({unity install path}/Data/CGIncludes/UnityCG.cginc。 Mac版位于/Applications/Unity/Unity.app/Contents/CGIncludes/UnityCG.cginc。
在代码中我们只需要添加 #include "UnityCG.cginc"就可以使用里面的结构和方法。
顶点着色器的原型是 v2f vert (appdata v)
appdata 是输入,可以自己定义也可以使用Unity预定义的。Unity在UnityCG.cginc预定义了三种常用的输入结构:appdata_base,appdata_tan,appdata_full。
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0; };
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0; };
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3; #if defined(SHADER_API_XBOX360)
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5; #endif
fixed4 color : COLOR; };
我们注意到这些结构的字段和表面着色器中的字段不同,后面多了一个冒号和一个标签。这是该字段的语义,用于告诉GPU这个字段的数据应该去哪里读写。GPU毕竟是为了图形计算而特别设计的东西,很多东西都是固定的,我们只要记得有这么几个名字可以用行了。
顶点在模型坐标系下的位置
顶点的法向量
顶点的切向量
顶点的第一个uv坐标
顶点的第二个uv坐标,最多可以到5
顶点着色器的输出是也是一个可以自己定义的结构,但是结构内容也是比较固定的,一般包含了顶点投影后的位置,uv,顶点色等,也可以加一些后面片段着色器需要用到但是需要在顶点着色器中计算的值。这个输出就是后面片段着色器的输入。
struct v2f
float4 pos : SV_POSITION;
: TEXCOORD0;
可以使用的字段有:
SV_POSITION
顶点在投影空间下的位置,注意和输入的模型坐标系下的位置不同,这个字段必必须设置,这个坐标转换是顶点着色器的重要工作
顶点在视图坐标系下的法向量
第一张贴图的uv坐标
第二张贴图的uv坐标
切向量,主要用来修正法线贴图Normal Maps
第一个定点色
第二个定点色
其他自定义的字段
顶点着色器有一项重要的工作就是进行坐标变换。顶点着色器的输入中的坐标是模型坐标系(ObjectSpace)下的坐标,而最终绘制到屏幕上的是投影坐标。
在我们Shader里面只需要一句话就可以完成坐标的转换,这也是最简单的顶点着色器:
v2f vert(appdata v) {
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
用UNITY_MATRIX_MVP矩阵乘以顶点在模型坐标系下的坐标就得到投影坐标。
UNITY_MATRIX_MVP是Unity内建的模型-&视-&投影矩阵, Unity内建矩阵如下:
UNITY_MATRIX_MVP:当前模型-&视图-&投影矩阵。(注:模型矩阵为 本地-&世界) UNITY_MATRIX_MV:当前模型-&视图矩阵 UNITY_MATRIX_V:当前视图矩阵 UNITY_MATRIX_P:当前投影矩阵 UNITY_MATRIX_VP:当前视图-&投影矩阵 UNITY_MATRIX_T_MV:转置模型-&视图矩阵 UNITY_MATRIX_IT_MV:逆转置模型-&视矩阵, 用于将法线从ObjectSpace旋转到WorldSpace。为什么法线变化不能和位置变换一样用UNITY_MATRIX_MV呢?一是因为法线是3维的向量而- UNITY_MATRIX_MV是一个4x4矩阵,二是因为法线是向量,我们只希望对它旋转,但是在进行空间变换的时候,如果发生非等比缩放,方向会发生偏移。 UNITY_MATRIX_TEXTURE0 to UNITY_MATRIX_TEXTURE3:纹理变换矩阵
下面简单介绍一下里面提到的几个坐标系:
模型坐标系:也叫物体坐标系,3D建模的时候每个模型都是在自己的坐标系下建立的,如果一个人物模型脚底是(0,0,0) 点的话它的身上其它点的坐标都是相对脚底这个原点的。
世界坐标系:我们场景是一个世界,有自己的原点,模型放置到场景中后模型上的每个顶点就有了一个新的世界坐标。这个坐标可以通过模型矩阵×模型上顶点的模型坐标得到。
视图坐标系:又叫观察坐标系,是以观察者(相机)为原点的坐标系。场景中的物体只有被相机观察到才会绘制到屏幕上,相机可以设置视口大小和裁剪平面来控制可视范围,这些都是相对相机来说的,所以需要把世界坐标转换到视图坐标系来方便处理。
投影坐标系:场景是3D的,但是最终绘制到屏幕上是2D,投影坐标系完成这个降维的工作,投影变换后3D的坐标就变成2D的坐标了。投影有平行投影和透视投影两种,可以在Unity的相机上设置。
屏幕坐标系 : 最终绘制到屏幕上的坐标。屏幕的左下角为原点。
除了内建矩阵,Unity还内建了一些辅助函数也可以在顶点着色器里面使用:
float3 WorldSpaceViewDir (float4 v):根据给定的局部空间顶点位置到相机返回世界空间的方向(非规范化的) float3 ObjSpaceViewDir (float4 v):根据给定的局部空间顶点位置到相机返回局部空间的方向(非规范化的) float2 ParallaxOffset (half h, half height, half3 viewDir):为视差法线贴图计算UV偏移 fixed Luminance (fixed3 c):将颜色转换为亮度(灰度) fixed3 DecodeLightmap (fixed4 color):从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR) float4 EncodeFloatRGBA (float v):为储存低精度的渲染目标,编码[0..1)范围的浮点数到RGBA颜色。 float DecodeFloatRGBA (float4 enc):解码RGBA颜色到float。 float2 EncodeViewNormalStereo (float3 n):编码视图空间法线到在0到1范围的两个数。 float3 DecodeViewNormalStereo (float4 enc4):从enc4.xy解码视图空间法线
Fragment Shader
原文地址:
版权声明:本文为博主原创文章,未经博主允许不得转载。
来源:http://blog.csdn.net/ring0hx/article/details/

我要回帖

更多关于 js阻止点击事件穿透 的文章

 

随机推荐