- 博客(10)
- 收藏
- 关注
原创 Laya实现Stencil模板测试
Stencil模板测试是一个类似于深度测试的功能,由WebGL提供,但Laya目前没有实现。图1是未使用Stencil的效果,因为顶点重叠,阴影效果不理想。图二使用了Stencil,已绘制阴影的地方不再重复绘制。Laya引擎版本:2.11.0 ts实验版1、首先在WebGLContext.ts中添加WebG的Stencil相关接口: /** * @internal */ static setStencilFunc(gl: WebGLRenderingContext, fun
2021-06-04 12:08:24
460
1
原创 unity光照衰减中的unity_worldToLight
在Unity5.x某个版本升级后,_LightMatrix0变为unity_worldToLight。按官方文档,unity_worldToLight是从世界空间到光源空间的变换矩阵,变换得到的坐标用于采样光强衰减纹理,具体使用方法: float3 lightCoord = mul(_LightMatrix0, float4(i.worldPos, 1)).xyz; fixed atten = tex2D(_LightTexture0, dot(lightCoord, lightCoord).r
2021-02-23 11:20:51
2173
原创 透明物体渲染
为什么渲染顺序很重要?A是半透明物体,B是不透明物体,A更靠近摄像机。如果先渲染A,那么在渲染B的时候,B就无法通过深度测试,导致B的片元被舍弃。解决方法:先渲染完所有不透明物体后,再渲染透明物体为什么要关闭深度写入?A和B都是半透明物体,Unity在渲染半透明物体时,会基于物体中心对两个物体进行排序,来实现半透明物体的从后往前渲染的目的。下图A和B使用的是同一个Shader,并且没有关闭深度写入。因此A渲染后,B被A遮挡的部分没有通过深度测试而被舍弃了。在shader中关闭深度写入后
2021-02-19 20:25:13
513
原创 Laya实现LineRenderer
文章目录前言一、目标二、原理1.构建Plane2.构建转换矩阵三、实现LineSprite3D.tsLineRenderer.ts为Laya引擎增加LineSprite3D使用前言Laya目前为止还没有支持LineRenderer这个组件,在做相关特效的时候不是很方便,本文主要讲解如何仿照Unity在Laya上实现一个基础版的LineRenderer。提示:以下是本篇文章正文内容,下面案例可供参考一、目标Unity场景中包含的LineRenderer导出到Laya后,Laya可自动创建Line
2021-01-22 14:13:01
1062
7
原创 Laya自定义Shader实现Planar阴影(二)
接上一篇文章,把平面移到物体中间,低于平面的部分仍然会投影到平面上,如下图:出现这种原因,是因为shader中shadowPos.y = u_Plane_Height + 0.0001;固定了阴影的高度,所以低于平面的阴影也投影到了平面上,解决的方法是:低于平面的点在片元着色器中舍弃掉。下面只给出修改后的顶点着色器和片元着色器。 var vs = ` #if defined(GL_FRAGMENT_PRECISION_HIGH)
2021-01-15 10:01:30
549
原创 Laya自定义Shader实现Planar阴影(一)
最近有个需求,需要把物体的影子投影在某一个平面上,类似这样的效果:打开光照阴影之后,发现在小米测试机上只有45帧,于是决定使用自定义shader,增加一个pass通道渲染阴影。在实现前,有两点需要事先说明的的:1、这里预设接受投影得平面是已知的,并且平行于由x轴和z轴构成的平面,因此阴影的y坐标是已知的。如果想了解投影到任意平面的办法,可以参考https://zhuanlan.zhihu.com/p/97267754,本文不做讨论。2、上图中,超出平面的阴影是不显示的。但因为laya目前不支持Ste
2021-01-14 18:00:19
1101
1
原创 LinearEyeDepth的作用、原理
作用LinearEyeDepth的使用方法相对简单,只需传入深度纹理中的深度值(范围0~1)即可计算出实际的深度值。原理先来看看深度纹理中记录的深度值是怎么来的。在观察空间中,顶点z经过投影矩阵得到齐次坐标z’,z’除以齐次分量得到[-1,1]范围的坐标z’’,z’’*0.5+0.5得到[0,1]范围的坐标z’’’,z’’'的z分量既是深度纹理中储存的值。现在,我们只需要把深度纹理中的深度值进行反向计算,就可以得到实际的深度值。LinearEyeDepth会帮我们完成这个反向计算。...
2020-10-15 14:42:15
1987
原创 ComputeScreenPos解析
今天学习Unity Shader做水特效时,看到两个函数ComputeScreenPos、tex2Dproj,相关代码如下:……i.proj = ComputeScreenPos(UnityObjectToClipPos(v.vertex));……half depth = LinearEyeDepth(tex2Dproj(_CameraDepthTexture, i.proj).r);……注意到ComputeScreenPos得到的结果用在了tex2Dproj函数中作为uv参数。看函数名Com
2020-09-29 15:53:12
1025
原创 透视投影矩阵的推导
上图是3D渲染过程中的空间变换过程,这里主要讨论观察空间到裁剪空间的转换。由上图可知,经过观察变换后,空间变换为观察空间,也就是以摄像机坐标为原点的空间,这是接下来推导的前提。下图是一个视锥体,在视锥体范围内的物体为可视的,不在视锥体内的为不可视。我们有两个任务:1、判断一个点是否在视锥体内(用于裁剪超出屏幕的点)。2、计算顶点在裁剪空间上的坐标。我们先忘掉矩阵的概念,只用基本的三...
2020-01-20 16:05:16
1083
1
原创 逐顶点漫反射的过渡问题
逐顶点漫反射的过渡问题 在编写着色器过程中,发现漫反射的计算既可以放在顶点着色器中,也可以放在片元着色器中。两者会产生不同的效果,性能上也不一样。放在顶点着色器中计算,会出现顶点之间过渡不平滑的现象,有点像锯齿放在片元着色器中,过渡效果就很好 可以看到,片...
2020-01-20 15:55:12
236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人