Показать сообщение отдельно
Старый 30.08.2013, 23:56   #17
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.


мой первый полуспертый cg шейдер
по идее это солнце.

Shader "Custom/Main Sequence Star" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	

	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert
		#pragma target 3.0

		sampler2D _MainTex;
		
		struct Input {
			float2 uv_MainTex;
		};

		float3 mod(float3 uv, float res){
			return uv - res * floor(uv/res);
		}
		
		float snoise(float3 uv, float res){
			const float3 s = float3(1e0, 1e2, 1e4);
			
			uv *= res;
			
			float3 uv0 = floor(mod(uv, res))*s;
			float3 uv1 = floor(mod(uv+float3(1.), res))*s;
			
			float3 f = frac(uv); f = f*f*(3.0-2.0*f);
		
			float4 v = float4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z, uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z);		
			float4 r = frac(sin(v*1e-3)*1e5);
			float r0 = lerp(lerp(r.x, r.y, f.x), lerp(r.z, r.w, f.x), f.y);
			
			r = frac(sin((v + uv1.z - uv0.z)*1e-3)*1e5);
			float r1 = lerp(lerp(r.x, r.y, f.x), lerp(r.z, r.w, f.x), f.y);
			
			return lerp(r0, r1, f.z)*2.-1.;
		}



		half4 corona(float2 uv){
			float2 p = -0.5 + uv;
			float color0 = 3.0 - (3.*length(2.*p));
			float3 coord = float3(atan2(p.x,p.y)/6.2832+.5, length(p)*.4, .5);
				for(int i = 1; i <= 7; i++)
					{
						float power = pow(2.0, float(i));
						color0 += (1.5 / power) * snoise(coord + float3(0.,-_Time.y*.05, _Time.y*.01), power*16.);
					}
			return half4( color0, pow(max(color0,0.),2.)*0.4, pow(max(color0,0.),3.)*0.15 , 1.0);
		}
		
		void surf (Input IN, inout SurfaceOutput o) {			
			float2 texCoor = IN.uv_MainTex + float2(_Time.x,0);
		
			half4 c = tex2D (_MainTex, texCoor);
			

			float leng = length( float2(0.5,0.5) - IN.uv_MainTex);
			
			half4 c0 = half4( c.x, pow(max(c.x,0.),2.)*0.4, pow(max(c.x,0.),3.)*0.15 , 1.0);
			half4 c1 = half4( c.y, pow(max(c.y,0.),2.)*0.4, pow(max(c.y,0.),3.)*0.15 , 1.0);
			half4 c2 = half4( c.z, pow(max(c.z,0.),2.)*0.4, pow(max(c.z,0.),3.)*0.15 , 1.0);
			half4 c3 = half4( c.w, pow(max(c.w,0.),2.)*0.4, pow(max(c.w,0.),3.)*0.15 , 1.0);
			//цвет от сферы солнца
			o.Albedo = 3*(c0+c1+c2+c3);
			o.Albedo *= 1-3.3333*leng;
			//языки пламени по краям
			half4 flames = corona(IN.uv_MainTex);

			if(leng >= 0.25 && leng < 0.3){
			//край солнца и протуберанцы нарастающие

				float p = (0.3-leng)*20;
				
				o.Albedo = lerp(flames,o.Albedo,p);			

			}			
			if(leng >= 0.3){
			//корона

			o.Albedo = flames;	
			}			
		}
		ENDCG
	} 
	FallBack "Self-Illumin/Diffuse"
}
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (31.08.2013)