加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

根据三角形相似性计算每个顶点的阴影位置

发布时间:2020-12-14 03:21:05 所属栏目:大数据 来源:网络整理
导读:Shader "Cg planar shadow" {Properties{_Color("Object‘s Color",Color) = (0,1,1)_ShadowColor("Shadow‘s Color",1)}SubShader{Pass{Tags{ "LightMode" = "ForwardBase" } // rendering of objectCGPROGRAM#pragma vertex vert #pragma fragment frag//

Shader "Cg planar shadow" {
		Properties{
			_Color("Object‘s Color",Color) = (0,1,1)
			_ShadowColor("Shadow‘s Color",1)
		}
		SubShader{
			Pass{
				Tags{ "LightMode" = "ForwardBase" } // rendering of object

			CGPROGRAM

			#pragma vertex vert 
			#pragma fragment frag

			// User-specified properties
			uniform float4 _Color;

			float4 vert(float4 vertexPos : POSITION) : SV_POSITION
			{
				return mul(UNITY_MATRIX_MVP,vertexPos);
			}
			float4 frag(void) : COLOR
			{
				return _Color;
			}

			ENDCG
		}

		Pass{
			Tags{ "LightMode" = "ForwardBase" }
			// rendering of projected shadow
			Offset -2.0,-2.0
			// make sure shadow polygons are on top of shadow receiver

		CGPROGRAM
		#pragma vertex vert 
		#pragma fragment frag
		#include "UnityCG.cginc"
		uniform float4 _ShadowColor;
		uniform float4x4 _World2Receiver; // transformation from 
		float4 vert(float4 vertexPos : POSITION) : SV_POSITION{
			float4x4 modelMatrix = _Object2World;
			float4 lightDirection;
			if (0.0 != _WorldSpaceLightPos0.w){
				lightDirection = normalize(mul(modelMatrix,vertexPos - _WorldSpaceLightPos0));
			}
			else{
				lightDirection = -normalize(_WorldSpaceLightPos0);
			}

			float4 vertexInWorldSpace = mul(modelMatrix,vertexPos);
			//从矩阵从获取Y轴向量
			float4 world2ReceiverRow1 = float4(_World2Receiver[1][0],_World2Receiver[1][1],_World2Receiver[1][2],_World2Receiver[1][3]);
			 //顶点向量到Y轴投影
			float distanceOfVertex = dot(world2ReceiverRow1,vertexInWorldSpace);
			//灯光向量到Y轴的投影
			float lengthOfLightDirectionInY = dot(world2ReceiverRow1,lightDirection);
			if (distanceOfVertex > 0.0 && lengthOfLightDirectionInY < 0.0){
				//根据相似三角形定理计算出顶点延伸长度
				lightDirection = lightDirection * (distanceOfVertex / (-lengthOfLightDirectionInY));
			}
			else {
				lightDirection = float4(0,0);
			}
			
			return mul(UNITY_MATRIX_VP,vertexInWorldSpace + lightDirection);
		}
		float4 frag(void) : COLOR{
			return _ShadowColor;
		}
		ENDCG
		}
	}
}

参考自:https://en.wikibooks.org/wiki/GLSL_Programming/Unity/Shadows_on_Planes

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读