MainTex, i.uv); float3 worldNormal = normalize(i.worldNormal); float3 viewDir...normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz); float cosValue = dot(worldNormal, viewDir...MainTex, i.uv); float3 worldNormal = normalize(i.worldNormal); float3 viewDir...// sample the texture float3 worldNormal = normalize(i.worldNormal); float3 viewDir...normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz); float cosValue = dot(worldNormal, viewDir
fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal)); fixed3 viewDir...xyz); fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir, viewDir...fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal)); fixed3 viewDir...i.worldPos.xyz); fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(saturate(dot(reflectDir, viewDir...Blinn-Phong.png 得到一个新的公式 fixed3 halfDir = normalize(worldLightDir + viewDir); fixed3 specular = _LightColor0
【思路】:面向摄像机的物体,它的表面法线【normal】和视角向量【viewDir】的【夹角】越靠近边缘就越大。那么就可以根据这个夹角进行处理,夹角越大,那么发射光越强,就可以实现我们想要的效果。...要使用的参数【点到摄像机的向量viewDir】,法线向量【normal】, 求点积dot【返回两个向量夹角的余弦值,归一,如果方向一样值1,方向相反值-1,垂直值为0,所以在摄像机看到的范围内,越靠近边缘...RimColor; float _RimPower; struct Input { float2 uv_MainTex; float2 uv_BumpMap; float3 viewDir...UnpackNormal是unity自带的标准解压法线用的】 o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); // viewDir...value,0,1) // 如果1-这个值,越靠近边缘,rim值越大,自发光就越强 half rim = 1.0 - saturate(dot (normalize(IN.viewDir
filedia = _T("filedia"); const TCHAR* AcadVar::snapang = _T("snapang"); const TCHAR* AcadVar::viewdir...= _T("viewdir"); const TCHAR* AcadVar::viewsize = _T("viewsize");
float2 uv : TEXCOORD0; float3 lightDir : TEXCOORD1; float3 viewDir...TANGENT_SPACE_ROTATION; o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex).xyz); o.viewDir...fixed3 tangentLightDir = normalize(i.lightDir); fixed3 tangentViewDir = normalize(i.viewDir
diffuse = _LightColor0.rgb * albedo * max(0,dot(worldNormal,worldLightDir)); fixed3 viewDir...normalize(UnityWorldSpaceViewDir(i.worldPos)); fixed3 halfDir = normalize(worldLightDir + viewDir...fixed3 tangentLightDir = normalize(i.lightDir); fixed3 tangentViewDir = normalize(i.viewDir...Color.rgb; fixed3 diffuse = _LightColor0.rgb * diffuseColor; fixed3 viewDir...fixed3 tangentLightDir = normalize(i.lightDir); fixed3 tangentViewDir = normalize(i.viewDir
float4 uv : TEXCOORD0; float3 lightDir: TEXCOORD1; float3 viewDir...o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz; o.viewDir...fixed3 tangentLightDir = normalize(i.lightDir); fixed3 tangentViewDir = normalize(i.viewDir
sampler2D _MainTex; half4 _GhostColor; int _Pow; struct Input { float3 viewDir...(IN, o.Normal); o.Albedo = _GhostColor.rgb; half alpha = 1.0 - saturate(dot (normalize(IN.viewDir
float4 worldPos:TEXCOORD0; float3 worldNormal:TEXCOORD1; float3 reflectDir:TEXCOORD2; float3 viewDir...UnityObjectToWorldNormal(v.normal); o.lightDir = normalize(UnityWorldSpaceLightDir(o.worldPos)); o.viewDir...= UnityWorldSpaceViewDir(o.worldPos); o.reflectDir = reflect(-o.viewDir, o.worldNormal); TRANSFER_SHADOW...fixed4 frag (v2f i) : SV_Target { fixed3 worldNor = normalize(i.worldNormal); fixed3 viewDir...= normalize(i.viewDir); fixed3 lightDir = normalize(i.lightDir); fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz
fixed3 diffuse = _LightColor0.rgb * diffuseColor; fixed3 viewDir...normalize(UnityWorldSpaceViewDir(i.worldPos)); fixed3 halfDir = normalize(worldLightDir + viewDir
10 * dot(H, lightDir)); float k = min(1, _GL + 0.545); float v = 1 / (k* dot(viewDir..., H)*dot(viewDir, H) + (1 - k)); float all = d*f*v; float3 refDir = reflect(...-viewDir, n2); float3 ref = texCUBElod(_Cubemap, float4(refDir, _nMips - _GL*_nMips)).rgb..., n2))*_RimPower * _RimColor *tex2D(_RimTex, i.uv_MainTex); float3 frontrim = (dot(viewDir, n2))*_...FrontRimPower * _FrontRimColor *tex2D(_FrontRimTex, i.uv_MainTex); float3 sss = (1 - dot(viewDir,
这里先叠了个双层菲涅尔: //双层菲涅尔 fixed fresnel = saturate(_FresnelScale + (1 - _FresnelScale) * pow(1 - dot(normal, viewDir...0.05 : 0.4; half facing = saturate(dot(viewDir, normal)); facing = facing < 0.5 ?...reflectDir, 0); half3 sky = DecodeHDR(rgbm, unity_SpecCube0_HDR); fixed3 halfDir = normalize(lightDir + viewDir
但是在右边这种场景下渲染出来的效果和实际看到的效果少有区别,按照冯氏光照模型,视线方向和反射方向 > 90°,导致计算的反射光强度为0,反射角计算如下,< 0就取0 float spec = pow(max(dot(viewDir...(基本的向量加法求对角线),再归一化; 2)求反射因子,和冯氏的差不多,点乘后进行幂运算 vec3 lightDir = normalize(lightPos - FragPos); vec3 viewDir...= normalize(viewPos - FragPos); vec3 halfwayDir = normalize(lightDir + viewDir); float spec = pow...diff = max(dot(lightDir, normal), 0.0); vec3 diffuse = diff * color; // specular vec3 viewDir...} else { vec3 reflectDir = reflect(-lightDir, normal); spec = pow(max(dot(viewDir
diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir)); fixed3 viewDir...UnityWorldSpaceViewDir(i.worldPos)); fixed3 halfDir = normalize(worldLightDir + viewDir
e.GetMessageString() viewDir...(1, 1, 0);gp_Pnt origin(0, 0, 0);gp_Vec uDir(0, 0, 1);auto projectToPlane = [viewDir, origin, uDir](const...gp_Pnt& p) {gp_Vec normal = viewDir;gp_Vec v(origin, p);double t = normal.Dot(v) / normal.SquareMagnitude...gp_Vec& n1 = facesOut[faces[0]].normal;const gp_Vec& n2 = facesOut[faces[1]].normal;double dot1 = n1.Dot(viewDir...);double dot2 = n2.Dot(viewDir);if (dot1 * dot2 < 0) {silhouetteEdges.push_back(edge); // 剪影边}else if
vec2 texCoords = fs_in.TexCoords; texCoords = ParallaxMapping(fs_in.TexCoords, viewDir); ... ......vec2 ParallaxMapping(vec2 texCoords, vec3 viewDir) { float height = texture(depthMap, texCoords)....r; return texCoords - viewDir.xy / viewDir.z * (height * height_scale); } ... fs完整代码,增加了bool值parallax...) { float height = texture(depthMap, texCoords).r; return texCoords - viewDir.xy / viewDir.z...; 坐标是不在[0,1]丢弃即可,新增两行代码 if(parallax) { texCoords = ParallaxMapping(fs_in.TexCoords, viewDir
void main() { float specularStrength = 0.5f; vec3 norm = normalize(normal); // 归一化 vec3 viewDir...; //视线方向向量 vec3 reflectDir = reflect(-lightDir, norm); //镜面反射光向量 float spec = pow(max(dot(viewDir...0.0); diffuse = diffuseStrength * diff * lightColor; // Specular float specularStrength = 0.9; vec3 viewDir
reflectDir = normalize(reflect(-worldLight, worldNormal)); //计算观察方向,摄像机位置-顶点位置(要求同在世界坐标系下) fixed3 viewDir...LightColor0系统参数光照颜色 fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir, viewDir...,计算比较大; Bline-Phong使用(光线方向+观察方向)来替代反射向量; //世界光线方向和观察方向中间方向; fixed3 halfDir = normalize(worldLight + viewDir...切线空间变换矩阵rotation TANGENT_SPACE_ROTATION; o.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex)).xyz; o.viewDir...fixed3 tangentLightDir = normalize(v.lightDir); //切线空间-观察方向 fixed3 tangentViewDir = normalize(v.viewDir
可以在输入结构中根据自己的需要,可选附加这样的一些候选值: float3 viewDir - 视图方向( view direction)值。...上面已经提到过,Normalize函数,用于获取到的viewDir坐标转成一个单位向量且方向不变,外面再与点的法线做点积。最外层再用 saturate算出一[0,1]之间的最靠近的值。...外加Normalize了viewDir。因此求得的点积就是夹角的cos值。因为cos值越大,夹角越小,所以,这时取反来。这样,夹角越大,所反射上的颜色就越多。于是就得到的两边发光的效果。...可以在输入结构中根据自己的需要,可选附加这样的一些候选值: float3 viewDir - 视图方向( view direction)值。...上面已经提到过,Normalize函数,用于获取到的viewDir坐标转成一个单位向量且方向不变,外面再与点的法线做点积。最外层再用 saturate算出一[0,1]之间的最靠近的值。