Vízfelület Szécsi László
Nyílt víz a nyílt óceánon a felületi cseppecskék körmozgást végeznek trochoid hullámforma hullámhossz hullámmagasság amplitúdó csepp pályája hullám terjedése gerinc völgy
Munkamenet -letöltés: -ripples normal map -kell egy nagy sík Mesh -terrain mesh pont jó lesz -ha kicsit csalunk vele -erre kell egy ShadedMesh egy új technikával -ocean.fx
XML <CubeTexture name="environmentCubeTexture" file="fullNoon.dds" /> <Texture name="normalMap" file="waves2.dds" />
XML <Entity name="ocean" shadedMesh="ocean" />
új effect: ocean.fx engineCore.fx-be #include ocean.fx
technique (minden más ez elé jön) technique ocean { pass ExamplePass { CullMode = CW; VertexShader = compile vs_3_0 vsOcean(); PixelShader = compile ps_3_0 psOcean(); }
uniform változó float time=0;
hullámfüggvények struct Wave{ floatwavelength; floatamplitude; float3direction; }; #define NWAVES 4 Wave wave[NWAVES] = { {65.0f, 1.0f, float3(0.98, 0, 0.17) }, {43.5f, 0.6f, float3(0.98, 0, -0.17) }, {22.0f, 0.4f, float3(0.934, 0, 0.342) }, {99.0f, 2.0f, float3(0.934, 0, ) } };
segédfüggvény float3 evaluateWaveWithDerivative(Wave w, float phase, out float3 derivative){ float2 offset; sincos(phase, offset.x, offset.y); offset *= -w.amplitude; derivative = (w.direction + float3(0, 1, 0)) * offset.yxy; float3 displacement = (w.direction - float3(0, 1, 0)) * offset.xyx; return displacement; } hullámparaméterek φ egy hullám miatti eltolás egy hullám miatti parciális deriváltak
input-output struct OceanInput { float4 pos: POSITION; }; struct OceanOutput { float4 pos: POSITION; float3 normal: NORMAL; float3 worldPos: TEXCOORD0; float3 tangent: TEXCOORD1; float3 binormal: TEXCOORD2; float2 tex: TEXCOORD3; };
vertex shader eleje OceanOutput vsOcean(OceanInput input) { OceanOutput output = (OceanOutput)0; //csalás következik input.pos.y = 0; // terrain lapítás input.pos.xz *= 0.1; //kicsi háromszögek kellenek
hullámok hatásainak összegzése float3 posShift = 0;//eltolás float3 du = float3(1, 0, 0);//parciális u szerint float3 dv = float3(0, 0, 1);//parciális v szerint for (int i=0;i<NWAVES;i++) { float kdotp = dot(input.pos, wave[i].direction); float phase = 6.28 / wave[i].wavelength * ( kdotp + time * sqrt( * wave[i].wavelength)); posShift += evaluateWaveWithDerivative(wave[i], phase, da); float da *= 6.28 / wave[i].wavelength; du += da * wave[i].direction.x; dv += da * wave[i].direction.z; }
pozíció módosítás input.pos.xyz += posShift; output.worldPos = mul(input.pos, modelMatrix); output.pos = mul(input.pos, modelViewProjMatrix); output.tex = input.pos.xz;
normálvektor a parciális deriváltakból output.binormal = normalize(du); output.tangent = normalize(dv); output.normal = normalize(cross(dv,du));
vertex shader vége return output; }
pixel shader float4 psOcean(OceanOutput input) : COLOR0 { // ideiglenes kód float3 worldNormal = normalize(input.normal); float3 viewDir = -normalize(eyePosition - input.worldPos); float3 reflDir = reflect(viewDir, worldNormal); return texCUBE(environmentCubeSampler, reflDir) * float4(0.5, 0.6, 0.8, 1.0) * input.normal.y; }
próba hullámpala
mozgás time beállítása void EngineCore::animate(double dt, double t) { effect->SetFloat("time", t); …
próba mozog
normal mapping texture normalMap; sampler2D normalMapSampler = sampler_state{ texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; };
pixel shader half4 t0 = tex2Dlod(normalMapSampler, float4(input.tex * *0.07 * float2(1,0) * time * float2(-1,-1), 0, 0)); half4 t1 = tex2Dlod(normalMapSampler, float4(input.tex * *0.057 * float2(0.86, 0.5) * time * float2(1,-1), 0, 0)); half4 t2 = tex2Dlod(normalMapSampler, float4(input.tex * *0.047 * float2(0.86, -0.5) * time * float2(-1,1), 0, 0)); half4 t3 = tex2Dlod(normalMapSampler, float4(input.tex * *0.037 * float2(0.7, 0.7) * time, 0, 0)); half3 N = (t0 + t1 + t2 + t3).xzy * ; N.xz *= 2.0; N = normalize(N); half3x3 m; m[0] = input.tangent; m[1] = input.normal; m[2] = input.binormal; half3 worldNormal = mul(N, m); worldNormal = normalize(worldNormal); //float3 worldNormal = normalize(input.normal);
próba fodrok
mivel lehet javítani? -Fresnel visszaverődés -meredeken belátni a víbe -lapos szögben tükör -víz alatti szín -végtelen óceán -a háló nézetfüggő elhelyezése -csúcspontok elmozdítása világkoordináta alapján -habtextúra