Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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ó.

Hasonló előadás


Az előadások a következő témára: "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ó."— Előadás másolata:

1 Vízfelület Szécsi László

2 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

3 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

4 XML <CubeTexture name="environmentCubeTexture" file="fullNoon.dds" /> <Texture name="normalMap" file="waves2.dds" />

5 XML <Entity name="ocean" shadedMesh="ocean" />

6 új effect: ocean.fx engineCore.fx-be #include ocean.fx

7 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(); }

8 uniform változó float time=0;

9 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, -0.342) } };

10 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

11 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; };

12 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

13 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(1.5915 * 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; }

14 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;

15 normálvektor a parciális deriváltakból output.binormal = normalize(du); output.tangent = normalize(dv); output.normal = normalize(cross(dv,du));

16 vertex shader vége return output; }

17 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) * 0.3 + float4(0.5, 0.6, 0.8, 1.0) * input.normal.y; }

18 próba hullámpala

19 mozgás time beállítása void EngineCore::animate(double dt, double t) { effect->SetFloat("time", t); …

20 próba mozog

21 normal mapping texture normalMap; sampler2D normalMapSampler = sampler_state{ texture = ; MinFilter = LINEAR; MagFilter = LINEAR; MipFilter = LINEAR; AddressU = Wrap; AddressV = Wrap; };

22 pixel shader half4 t0 = tex2Dlod(normalMapSampler, float4(input.tex * 0.02 + 2*0.07 * float2(1,0) * time * float2(-1,-1), 0, 0)); half4 t1 = tex2Dlod(normalMapSampler, float4(input.tex * 0.03 + 2*0.057 * float2(0.86, 0.5) * time * float2(1,-1), 0, 0)); half4 t2 = tex2Dlod(normalMapSampler, float4(input.tex * 0.05 + 2*0.047 * float2(0.86, -0.5) * time * float2(-1,1), 0, 0)); half4 t3 = tex2Dlod(normalMapSampler, float4(input.tex * 0.07 + 2*0.037 * float2(0.7, 0.7) * time, 0, 0)); half3 N = (t0 + t1 + t2 + t3).xzy * 2.0 - 3.3; 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);

23 próba fodrok

24 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


Letölteni ppt "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ó."

Hasonló előadás


Google Hirdetések