全球热头条丨世界空间中的着色器 从对象空间到世界空间的转换
从对象空间到世界空间的转变
如果一个对象被直接放入世界空间中,游戏对象会通过转换组件直接将对象的坐标转成世界坐标。你可以在 Scene 视图或者 Hierarchy 视图中选中一个对象,然后在 Inspector 视图中查看 Transform 组件。在 Transform 组件中包括 Position、Rotation 和 Scale 属性,这个组件用来指定从本地坐标到世界坐标的顶点转换(如果一个游戏对象拥有父级对象,那么转换组件只转换父级对象的坐标)。在《Vertex Transformations》章节中,我们将讨论顶点的转换、旋转、缩放以及 4 x 4 矩阵组合变换的细节。
(资料图片仅供参考)
回到我们的例子中:从对象空间到世界空间的转换是通过 4 x 4 矩阵来转换的,也叫“模型矩阵”,这个矩阵在 Unity 中通过 uniform 参数 _Object2World 已经声明了:
Shader "Custom/World Space"
{ SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag //uniform flaot4*4 Object3World //automatic definition of a Unity-specific uniform parameter 自动定义统一值是unity的一个特性 struct vertexOutput { float4 pos: SV_POSITION; float4 position_in_world_space : TEXCOORD0; }; vertexOutput vert(float4 vertex:POSITION) { vertexOutput output; output.pos = mul(UNITY_MATRIX_MVP,vertex); output.position_in_world_space = mul(_Object2World,vertex);//物体坐标转化为世界坐标 return output; } float4 frag(vertexOutput input) :COLOR { float dist = distance(input.position_in_world_space,float4(0.0,0.0,0.0,1.0)); //计算片段位置与原点距离(第四个坐标永远是1) if (dist < 5.0) { return float4(0.0, 1.0, 0.0, 1.0); //接近 } else return float4(0.3,0.3,0.3,1.0);//远离原点 } ENDCG } }
}
更多的 Unity Uniforms
在 Unity 中,定义了几个和 _Object2World 一样的 float4x4 矩阵,下面是在系列教程中使用的 uniforms 简短列表:
uniform float4 _Time, _SinTime, _CosTime; // time valuesuniform float4 _ProjectionParams;// x = 1 or -1 (-1 if projection is flipped)// y = near plane; z = far plane; w = 1/far planeuniform float4 _ScreenParams; // x = width; y = height; z = 1 + 1/width; w = 1 + 1/heightuniform float4 unity_Scale; // w = 1/scale; see _World2Objectuniform float3 _WorldSpaceCameraPos;uniform float4x4 _Object2World; // model matrixuniform float4x4 _World2Object; // inverse model matrix // (all but the bottom-right element have to be scaled // with unity_Scale.w if scaling is important) uniform float4 _LightPositionRange; // xyz = pos, w = 1/rangeuniform float4 _WorldSpaceLightPos0; // position or direction of light sourceuniform float4x4 UNITY_MATRIX_MVP; // model view projection matrix uniform float4x4 UNITY_MATRIX_MV; // model view matrixuniform float4x4 UNITY_MATRIX_V; // view matrixuniform float4x4 UNITY_MATRIX_P; // projection matrixuniform float4x4 UNITY_MATRIX_VP; // view projection matrixuniform float4x4 UNITY_MATRIX_T_MV; // transpose of model view matrixuniform float4x4 UNITY_MATRIX_IT_MV; // transpose of the inverse model view matrixuniform float4x4 UNITY_MATRIX_TEXTURE0; // texture matrixuniform float4x4 UNITY_MATRIX_TEXTURE1; // texture matrixuniform float4x4 UNITY_MATRIX_TEXTURE2; // texture matrixuniform float4x4 UNITY_MATRIX_TEXTURE3; // texture matrixuniform float4 UNITY_LIGHTMODEL_AMBIENT; // ambient color
用户指定 Uniforms:着色器属性
还有一个更重要的 uniform 参数:用户自定义的 uniforms。实际上,这是 Unity 的属性,你可以认为他们是着色器的用户自定义 uniform 参数。通常一个着色器不带参数只能由编写的程序员在一些特定的程序中使用,但是如果一个着色器拥有参数并且还带有描述性的说明,那么这个着色器就可以被其他人使用,另外,如果你打算出售你的着色器,为着色器的提供参数会大大增加它的价值。
因为在 Unity 的 ShaderLab 中使用《description of shader properties 》非常不错,通过下面的例子我们来了解如何使用着色器属性,首先,我们声明一个属性,然后我们再定义一个与属性名称相同、类型相同的 uniforms 。
Shader "Cg shading in world space" { Properties { _Point ("a point in world space", Vector) = (0., 0., 0., 1.0) _DistanceNear ("threshold distance", Float) = 5.0 _ColorNear ("color near to point", Color) = (0.0, 1.0, 0.0, 1.0) _ColorFar ("color far from point", Color) = (0.3, 0.3, 0.3, 1.0) } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" // defines _Object2World and _World2Object // uniforms corresponding to properties uniform float4 _Point; uniform float _DistanceNear; uniform float4 _ColorNear; uniform float4 _ColorFar; struct vertexInput { float4 vertex : POSITION; }; struct vertexOutput { float4 pos : SV_POSITION; float4 position_in_world_space : TEXCOORD0; }; vertexOutput vert(vertexInput input) { vertexOutput output; output.pos = mul(UNITY_MATRIX_MVP, input.vertex); output.position_in_world_space = mul(_Object2World, input.vertex); return output; } float4 frag(vertexOutput input) : COLOR { float dist = distance(input.position_in_world_space, _Point); // computes the distance between the fragment position // and the position _Point. if (dist < _DistanceNear) { return _ColorNear; } else { return _ColorFar; } } ENDCG } }}
使用 sharedMaterial 我们可以改变所有使用了这个材质的对象的参数,如果你只希望改变一个并使用了这个材质的对象的参数,那么你应该使用 material 。假如你设置 _Point 属性为另一个对象的位置信息,这样你只需要在 Unity 中移动这个对象就可以查看效果了,你可以复制/粘贴 下面的代码到一个 C# 脚本中:
using UnityEngine;using System.Collections;[ExecuteInEditMode]public class NewBehaviourScript : MonoBehaviour {public GameObject other;void Update(){if(other != null){GetComponent().sharedMaterial.SetVector("_Point", other.transform.position);}}}
然后我们只需要移动另一个对象(Sphere)就可以看到(Cube)颜色的变化,当小球离原点近时,如图:
当小球离原点远时,如图:
在《在着色器中调试》章节中提到,顶点输入参数使用语义词 POSITION 指定对象的坐标,即本地对象(模型)的网格空间坐标,对象空间(对象的坐标系统)是特定于每个游戏对象的,然而,所有的游戏对象会被转换到一个共同的坐标系中(世界空间)。
标签:
相关推荐:
最新新闻:
- 全球今头条!连连支付怎么样?连连靠谱吗?
- AngularJS中的refresher该如何使用?使用技巧|动态
- 环球观焦点:B站视频播放源地址获取及B站视频下载
- 复旦壁纸:手绘正校门1024、7681280
- 设计带构造函数的Dog类 对数据成员进行初始化
- 焦点报道:薛定谔的猫和EPR佯谬——量子力学史上的经典术语
- 最新:在百度里下载格式工厂——KuGo格式
- speedtest-cli|网速测试工具命令行方式
- 【数据更新】全国上网卡专属号段数据汇总
- 非定常约束:几何约束与完整约束的区别
- 图片文件合成器是什么?图片、文件合成器的原理与方法
- 微头条丨java timestamp 格式化_java日期处理(Timestamp)
- 【世界时快讯】《满江红》让杭州岳王庙成热门打卡地:秦桧像曾被砸烂9次
- 分享5个高质无损音乐网站 歌曲很丰富
- 全球热头条丨世界空间中的着色器 从对象空间到世界空间的转换
- 【世界快播报】《如龙:维新!极》“复仇之刃”预告 全新截图欣赏
- 索尼承诺在PSVR2发行前“增加PS5主机供应”:全球要闻
- 郭明錤:可折叠iPad或明年问世,今年苹果可能不会发新品,出货至少下降10%
- 【环球速看料】《死亡空间:重制版》开发者讨论该系列未来发展
- 音游《最终幻想:节奏剧场》试玩版2月1日上线
- 财报预警!三大航空公司合计预亏超千亿,昔日养猪巨头亏损超百亿
- 热点在线丨《死亡空间》重制版不支持Steam deck
- 无人驾驶出租?旧金山表示先缓缓_世界新资讯
- NBC季度亏损10亿!好于华尔街预期
- 三星新款翻转笔记本曝光:高配13代i9-13900H
- 联想拯救者新品将用上超频内存 支持DDR5-6000_环球快看点
- Xbox金会员2月会免游戏公布 《为了吾王》等
- 全球观热点:青海春天药用资源科技股份有限公司 2022年度业绩预亏暨风险提示公告
- 兔年首个交易日,两大股东公告“抢筹”兴业银行
- 突发!伦敦街头惊现《战神》利维坦之斧:外观霸气 地面开裂
- 【世界热闻】曝百度将推人工智能聊天工具:类似ChatGPT
- 国产《时灵:星辰愚者》2月14日发售 登陆PS5/PC/NS
- 环球微动态丨腾讯游戏春节7天吸金破4.5亿:《王者荣耀》收入超3千万!
- 【环球速看料】PS5广告:奎爷利维坦巨斧现身英国伦敦
- 《流浪地球2》MOSS和末日铁拳是一个配音演员:给破球来个上勾拳!:世界快消息
- 摩根士丹利“大空头”警告:不要参与反弹行情,美股熊市还没结束
- 暴雪游戏国服“头七” 你找到合适的平替游戏了吗?
- 效仿印尼,全球第二大镍生产国菲律宾考虑对镍出口征税
- 消费者遭遇特步反向抹零 特步回应:系统设置四舍五入
- 超4000万!Capcom称当前财年销量有望是史上最高一年:全球即时看
- 最新:我爱我家2022年业绩预告:聚焦品质服务 推进精细运营
- 我家的春节泡汤了,因为家里有人没阳
- 《卧龙:苍天陨落》中有“黑暗熊猫”登场:不会伤人的可爱萌物-世界最新
- 快看点丨消费修复成色几何?
- 世界今日讯!以技术革新引领绿色制造 三菱电机助力碳中和愿景
- 可折叠iPad将于2024年发布,使用碳纤维铰链:环球快资讯
- 天天新资讯:买一个游戏花 6000 块,玩完发现太值了?
- 颜值绝了!荣耀Magic5 Lite渲染图曝光
- 前景悲观!德国四季末GDP同比初值 0.5%,环比下降0.2% 焦点快看
- 在罐头里跑酷几十小时后,我成为了首席大法师_环球热点
- 和宋慧乔闪离3年多!37岁宋仲基官宣再婚当爸-全球即时
- 【天天快播报】电影《流浪地球2》观影人次破5000万! 豆瓣8.2分
- R星入驻B站 《GTA Online》技场之战活动宣传片公开-全球实时
- 《满江红》7天营收7千万也带不动 光线传媒股价暴跌
- 当前资讯!优酷八年错过与失去
- 焦点要闻:5年连亏50亿,豆神教育难自救
- 要闻速递:小米开年首件关键大事公布:设立两个新专业委员会
- RTX 4090 Ti解锁满核心 跑出恐怖600W功耗
- 富士通推出689g笔记本 史上第一轻14寸-全球滚动
- 最完美iPhone曝光:想用上还得再等一年
- 宏碁将进军显卡市场:显卡外观曝光
- 网友热议《马里奥大电影》森喜刚配音:塞斯·罗根笑声太出戏 今日播报
- 雷军宣布小米开年第一件大事:新成立两个委员会 很关键-焦点快报
- 韩国暗黑奇幻版逃离塔科夫《Dark and Darker》2月6日进行试玩测试_全球播报
- 环球微头条丨《高达:进化》第三季更新详情 新机体新点数公开
- 最资讯丨架设“XX魔域”游戏私服牟利260余万元 4名嫌疑人被抓获
- 参演《流浪地球2》的电脑到底是什么来头|世界要闻
- 小米11、红米K40等25款神机在列!MIUI 14第二批升级计划公布_全球看热讯
- 15 万的特斯拉 Model Q 要来了,或 3 月 1 日亮相-世界独家
- HPE(Aruba)连续获Gartner企业级有线和无线局域网基础设施魔力象限领导者
- MIUI 14正式版第二批机型公布,小米11、K40、Note12都安排上了 世界时讯
- 01月30日12时海南琼中昨日疫情新增0例、累计报告阳性感染者确诊14例-环球今热点
- 南宁动物园猩猩扔水瓶砸伤游客 游客先有过激行为 每日视点
- 环球热议:苹果上架密码锁:适用于Mac Studio 售价548元
- 世界快播:《星空之海》昼夜系统演示片段 官方希望玩家添加愿望单