unity引擎源码
‘壹’ unity shader里 dot(lightCoord, lightCoord).rr
#ifdef USING_DIRECTIONAL_LIGHT
fixed atten = 1.0;
#else
float3 lightCoord = mul(_LightMatrix0, float4(i.worldPos, 1)).xyz;
fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
#endif
_LightMatrix0:这个变量在书的P184页表格和官方文档中均有说明,它在内置的AutoLight.cginc文件中的特定宏下被定义,可以用于把点从世界空间变换到该光源的局部空间下。因此,上面代码第一句“mul(_LightMatrix0, float4(i.worldPos, 1)).xyz”就是把顶点坐标变换到光源空间下的坐标,这点在书中也有解释。
_LightTexture0:和_LightMatrix0类似的,也是在内置的AutoLight.cginc文件中的特定宏下被定义,紧跟_LightMatrix0的定义。它是一张包含了光源衰减信息的衰减纹理,我们可以用第一句代码得到的坐标进一步处理得到衰减纹理的采样坐标。由于Unity没有官方解释_LightMatrix0具体的数值范围含义,我们可以推测得到(推测方法可以是利用假彩色一节的方法来把这个变量当成颜色输出)_LightMatrix0得到的坐标模范围会是[0, 1],即与光源重合处是(0, 0, 0), 在光源范围的边界处模值为1。而 dot(lightCoord, lightCoord).rr一句,首先是由点积得到光源的距离平方,这是一个标量,我们对这个变量进行.rr操作相当于构建了一个二维矢量,这个二维矢量每个分量的值都是这个标量值,由此得到一个二维采样坐标。这个操作是shader中常见的swizzling操作,Cg的官网上也有说明。我们随后使用这个二维坐标对光照衰减纹理_LightTexture0进行采样,得到衰减值。关于_LightTexture0后面会系统讲。
这段代码不够规范:书上有说这一节的代码不能直接用到项目里,仅仅是用来阐述原理,但如果你想用这段代码直接发布项目的话,是需要修改的,因为当时写的时候不够规范。原因是这段代码的keyword判断条件有问题,导致_LightTexture0或_LightMatrix0可能并没有被定义。我们可以将原来的代码替换成下面的代码(新的代码也已经push到了github上):
#ifdef USING_DIRECTIONAL_LIGHT
fixed atten = 1.0;
#else
#if defined (POINT)
// 把点坐标转换到点光源的坐标空间中,_LightMatrix0由引擎代码计算后传递到shader中,这里包含了对点光源范围的计算,具体可参考Unity引擎源码。经过_LightMatrix0变换后,在点光源中心处lightCoord为(0, 0, 0),在点光源的范围边缘处lightCoord模为1
float3 lightCoord = mul(_LightMatrix0, float4(i.worldPos, 1)).xyz;
// 使用点到光源中心距离的平方dot(lightCoord, lightCoord)构成二维采样坐标,对衰减纹理_LightTexture0采样。_LightTexture0纹理具体长什么样可以看后面的内容
// UNITY_ATTEN_CHANNEL是衰减值所在的纹理通道,可以在内置的HLSLSupport.cginc文件中查看。一般PC和主机平台的话UNITY_ATTEN_CHANNEL是r通道,移动平台的话是a通道
fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
#elif defined (SPOT)
// 把点坐标转换到聚光灯的坐标空间中,_LightMatrix0由引擎代码计算后传递到shader中,这里面包含了对聚光灯的范围、角度的计算,具体可参考Unity引擎源码。经过_LightMatrix0变换后,在聚光灯光源中心处或聚光灯范围外的lightCoord为(0, 0, 0),在点光源的范围边缘处lightCoord模为1
float4 lightCoord = mul(_LightMatrix0, float4(i.worldPos, 1));
// 与点光源不同,由于聚光灯有更多的角度等要求,因此为了得到衰减值,除了需要对衰减纹理采样外,还需要对聚光灯的范围、张角和方向进行判断
// 此时衰减纹理存储到了_LightTextureB0中,这张纹理和点光源中的_LightTexture0是等价的
// 聚光灯的_LightTexture0存储的不再是基于距离的衰减纹理,而是一张基于张角范围的衰减纹理
fixed atten = (lightCoord.z > 0) * tex2D(_LightTexture0, lightCoord.xy / lightCoord.w + 0.5).w * tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).UNITY_ATTEN_CHANNEL;
#else
fixed atten = 1.0;
#endif
#endif上面更加精确地判断了keyword条件,保证只在正确的时候执行访问衰减纹理的代码。_LightTexture0和_LightMatrix0只在某些条件下会被定义,例如在开启了POINT、SPOT、POINT_COOKIE、DIRECTIONAL_COOKIE等,具体我们可以在AutoLight.cginc里面找到。但因为原来的代码里没有进行严格判断,在发布的时候由于Unity会严格编译Unity Shader根据不同的keyword生成对应的shader program,此时它就会发现我们的错误了。
‘贰’ 怎么看unity3d的引擎源码
花钱买。跟Unity公司买。一般出自几百上千万,会给你的。但是你要有保密协议,不能外传。
‘叁’ Unity3D这款游戏引擎软件的源码是开源的吗
Unity3D是不开源的。
相关介绍:
Unity类似于Director、Blender game engine、Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。
开放源码软件通常是有right的,它的许可证可能包含这样一些限制: 蓄意的保护它的开放源码状态,着者身份的公告,或者开发的控制。“开放源码”正在被公众利益软件组织注册为认证标记,这也是创立正式的开放源码定义的一种手段。
(3)unity引擎源码扩展阅读
开放源码软件主要被散布在全世界的编程者队伍所开发,但是同时一些大学,政府机构承包商,协会和商业公司也开发它。源代码开放是信息技术发展引发网络革命所带来的面向未来以开放创新、共同创新为特点的、以人为本的创新2.0模式在软件行业的典型体现和生动注解。
共享软件。允许他人自由拷贝并收取合理注册费用。使用者可在软件规定的试用期限内免费试用,再决定注册购买与否。大部分共享版软件都有功能和时间限制,试用期通常分为7天、21天、30天不等。而有的共享软件还限制用户只能安装一次,若删除后重新安装将会失效。像Winzip、ACDSee等软件就是共享软件。
‘肆’ 怎么看unity3d的引擎源码
Unity3D是非开源项目,源码已经被编译加密了,不能查看。
如果实在想查看可以潜入unity公司内部~~·
‘伍’ unity源代码怎么导入
将源代码导入Assets目录后,
unity引擎会出现以下报错:
解决办法:
在 unity项目Assets目录中创建smcs.rsp文件,内容为-unsafe,其作用为可编译不安全代码。
‘陆’ unity源码多大
源码大小1个G,骗人是孙子。。。 (0)踩踩(0) 下载所需:1积分下载次数:1 禁用360或Edge浏览器 下载申明(下载视为同意此申明) 1.在网站...