Мастер
Регистрация: 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"
}
|