shader

Unity Shader踩坑笔记-2 ForwordBase-半兰伯特光照模型的问题记录

匿名 (未验证) 提交于 2019-12-03 00:38:01
Shader学习使用的是Unity2018.1.0b void vert(in a2v v,out v2f o){ o.pos=UnityObjectToClipPos(v.vertex); fixed3 Amb = UNITY_LIGHTMODEL_AMBIENT.xyz; float3 worldNormal = normalize(mul(v.normal,(float3x3)unity_WorldToObject)); float3 worldLight = normalize(_WorldSpaceLightPos0.xyz); fixed halfLan = 0.5*dot(worldNormal,worldLight) + 0.5; fixed3 diffuse1 = _LightColor0.rgb * _Diffuse.rgb * halfLan; o.color = Amb + diffuse1; } 右侧为半兰伯特模型的表现效果: 上图有加入了环境光。 然后,当我们把hierarchy面板中的Directional Light禁用掉,有趣的现象就出现了。 直接看代码,半兰伯特漫反射模型的光照是环境光+漫反射才对,然而,我们看到的却是: 为了能让半兰伯特漫反射模型能在无光照时正确的表现环境光的效果,代码可以进行一点点修改即可: fixed halfLan = 0

Unity3D Shader:宝石反射

匿名 (未验证) 提交于 2019-12-03 00:36:02
Shader "Unlit/Test" { Properties { _MainColor("MainColor",COLOR)=(0,0,0,1) [NoScaleOffset]_MainCUBE ("MainCUBE", CUBE) = "white" {} _RefStreng("RefStreng",Range(0,2.0))=0 _Enviorenment("Enviorenment",Range(0,2.0))=0 _Emission("Emission",Range(0,2.0))=0 } SubShader { Tags { "Queue"="Transparent" } LOD 100 Pass { Cull Front ZWrite Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 uv : TEXCOORD0; float3 n:NORMAL; }; struct v2f { float3 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; samplerCUBE _MainCUBE; float4

Cocos2dx--使用Shader

匿名 (未验证) 提交于 2019-12-03 00:34:01
Cocos2dx的Shader由GLProgram、GLProgramState、GLProgramCache、GLProgramStateCache组成。 GLProgram是Cocos2dx对Program的封装 ,一般提供一些静态方法,被多个节点复用。 而GLProgramState是对GLProgram的封装 ,提供更加便捷的操作接口,内部记录了Uniform和Attribute,可以看作一个动态的对象。GLProgram和GLProgramState可以对比理解类和对象的区别。 它们分别对应的xxCache类顾名思义用来做缓冲的,如Cocos2dx中所有内置Shader的名字,就在GLProgramCache的loadDefaultGLProgram()方法中,将所有内置的Shader都创建了出来并缓存。 下面我们先来分析下源码,看看Cocos2dx对Shader是怎么封装的,它与一般OpenGL编写的Shader脚本不同。 首先是GLProgram的compileShader()方法中,编译Shader前使用了precision关键字来设定数值的精度。总共有低精度lowp、中精度mediump、高精度highp可以选择,可以为浮点数或整数指定精度,精度越高效果越好,但消耗也越大。另外,顶点着色器支持的精度要比片段着色器高,片段着色器的highp精度的支持对于显卡而言

Unity-Shader Graph 安装

匿名 (未验证) 提交于 2019-12-03 00:32:02
本次安装 基于Unity2018.1.5f1 Package Manager->All-> Shader Graph 需要注意的是Shader Graph需要使用Unity提供的新的渲染管线Lightweight Render才能正常使用,安装好 Lightweight Render后创建一个新的渲染设置: 然后在在Edit->Project Setting->Graphics中选择新建好的 Lightweight Render 然后就可以创建Shader Graph了 创建好了以后双击编辑就可以使用Shader Graph进行着色器的编辑了。(ShderGraph不知道怎么查看源码,右键点击后有open C# project的选项,但是点击后会出一堆警告,无法查看) 需要注意的是:使用了轻量级渲染管线 Lightweight Render后,原来使用的普通着色器的Material将会显示贴图错误 需要切换至 Lightweight Rende提供的 新的着色器才能正常显示。 文章来源: Unity-Shader Graph 安装

[Unity] SV_POSITION位置导致的shader问题

匿名 (未验证) 提交于 2019-12-03 00:32:02
今天碰到了一个非常无语的问题,特写下来记录一下。 在PC上效果正常的shader,放到手机上就是一片粉。 挨个排查后最后发现是因为v2f中SV_POSITION放在最后没有放在最前面,挪到第一个就好了 这个人也碰到了这个SV_POSITION导致的问题,不过跟我的问题不一样。 https://forum.unity.com/threads/why-must-sv_position-be-the-first-output.245327/ 这是bug还是feature? 文章来源: [Unity] SV_POSITION位置导致的shader问题

Unity Shader - 阴影(平面阴影&球体阴影)

匿名 (未验证) 提交于 2019-12-03 00:29:01
阴影效果: 上面两幅图分别为:平面阴影和球体阴影的效果 平面阴影简述: 平面阴影是一种比较特殊的情形。在这种情形里,我们只考虑物体的阴影投射到平面上的情形,所以有一套相对比较简单的专用算法。 首先考虑最简单的情况,如何 计算一个平行光的投影 。平行光在我们的 计算中其实就是一个方向矢量 ,是 阴影的投射方向 ,而平面是阴影要影响的目标物体。我们 需要知道 到 目标物体的Object Space矩阵 ,在目标物体的空间内将 投影物体的顶点进行重新计算,计算其沿光线方向,在阴影接受平面上的位置,这个位置关系可以通过三角形相似来计算 。如果我们使用Unity自带的Plane作为阴影接受平面,那么我们只需要重新计算顶点的xz位置,如果阴影投射到Build In的Plane上,那么在其Object Space中,y应该为0,但是实际使用时, 为了保证阴影永远在物体上面,我们会对z进行偏移 。 平面阴影实现原理: 1.向shader传入阴影接收平面(通常是地面)的世界空间到模型空间的转换矩阵和模型空间到世界空间的转换矩阵; 2.在阴影接收平面空间下,根据灯光方向计算目标物体的顶点在平面上的投影坐标,最终得到阴影; 可以根据相似三角形,计算出AC,即目标物体的顶点沿着光照方向到达阴影接收平面的距离; 首先,每一个投射平面阴影的物体都需要下面这么一个脚本来告诉它阴影接受物体的信息,

[Unity优化]减少DrawCall:批处理

匿名 (未验证) 提交于 2019-12-03 00:27:02
参考链接: http://game.ceeger.com/Script/Mesh/Mesh.CombineMeshes.html 一、批处理 1.批处理的目的就是为了减少DrawCall。DrawCall即CPU命令GPU去绘制。 2.如果我们需要渲染一千个三角形,那么把它们按一千个单独的网格进行渲染所花费的时间要远大于直接渲染一个包含了一千个三角形的网格。 3.要想使用批处理,需要物体有相同的材质。这是因为,对于使用同一个材质的物体,它们的不同仅仅在于顶点数据的差别,我们可以把这些顶点数据合并在一起,再一起发送给GPU,就可以完成一次批处理。 4.在unity中,有两种批处理:一是动态批处理,二是静态批处理。 对于动态批处理,unity会自动完成,不需要我们进行操作,而且物体是可以移动的,但是动态批处理有许多限制条件。 对于静态批处理,物体不可移动,但是限制条件很少。 二、动态批处理 原理:每一帧把可以进行批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染。 限制: 1.顶点属性要小于900。例如,如果shader中需要使用顶点位置、法线和纹理坐标这三个顶点属性,那么要想让模型能够被动态批处理,它的顶点数目不能超过300。因此,优化策略就是shader的优化,少使用顶点属性,或者模型顶点数要尽可能少。 2.多Pass的shader会中断批处理。

Unity3D Shader : fragment Shader

匿名 (未验证) 提交于 2019-12-03 00:26:01
float3 WorldSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化 float3 UnityObjectToWorldDir(in float3 dir) //把方向矢量从模型空间转换到世界空间中 TANGENT //顶点法线,通常是float4类型 SV_POSITION //裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DirectX9中的 POSITION,但是最好是使用SV_POSITION UNITY_MATRIX_MV //当前的模型*观察矩阵,用于将顶点/方向矢量从模型空间转换到观察空间 UNITY_MATRIX_VP //当前的观察*投影矩阵,用于将顶点/方向矢量从世界空间转换到裁剪空间 Blend One 混合因子1,表示完全的源颜色或目标颜色 Zero 混合因子0,舍弃掉源颜色或目标颜色 SrcColor 源颜色值 SrcAlpha 源透明度 DstColor 目标颜色值 DstAlpha 目标透明度 OneMinusSrcColor 1-SrcColor OneMinusSrcAlpha 1-SrcAlpha OneMinusDstColor 1-DstColor OneMinusDstAlpha 1

Matcap Shader 详解【3】 - 利用Matcap实现基本PBR光照模型

匿名 (未验证) 提交于 2019-12-03 00:22:01
前言 第一篇文章 中提到 基础Matcap 的另一个缺陷是缺少经典BPR所具备的一些属性,本文的目的便是为了探讨如何解决这个缺陷。 第二篇文章 中,我们看到在没有使用 固有色(Albedo)贴图 时,Matcap的确能呈现出PBR效果,但与固有色叠加后,便会显得暗淡――这源于漫反射衰减与高光的缺失。 另一方面,Matcap是完全不考虑光照影响的渲染方法,因此也不存在能量守恒,只能通过采样贴图的绘制做出能量守恒的效果,所以不是真正的PBR,也因此能做出很多PBR无法实现的效果。 漫反射补偿 很多已有的Matcap采样图都是BPR渲染的结果,我们获得的固有色贴图也是衰减后的状态(比真正的固有色暗)。当这两种贴图采样相乘后,自然会显得很暗,这个问题也很容易处理,便是补偿损失的漫反射强度――对Matcap Diffuse采样图乘以大于1的数值,如下图所示: 高光 补偿后就不存在亮度的问题了,但这里还存在一个问题――高光颜色受到固有色影响。 本质原因在于MatcapDiffuse贴图理论上只用于计算漫反射以及次表面散射等现象(乘法)。但高光的计算应使用加法。 所以只需要在现有着色器上再加入一个 高光Matcap采样图,并把它加到现有的结果上。 (注:PS中的线性减淡就是加法) 上图中高光的颜色就正常了许多。这里还要说明一点