22

Displacement mapping

  • Upload
    hieu

  • View
    41

  • Download
    0

Embed Size (px)

DESCRIPTION

Displacement mapping. Kezdeti teendők. Letöltés: OgreDisplacementMappingBase.zip Kicsomagol Futtat: OgreDisplacement.sln Include és library útvonalak beállítása Working directory beállítása Fordít Futtat. Próba. Material scheme. … OIS:: InputManager * OISInputManager ; - PowerPoint PPT Presentation

Citation preview

Page 1: Displacement mapping
Page 2: Displacement mapping

Kezdeti teendőkLetöltés: OgreDisplacementMappingBase.zipKicsomagolFuttat: OgreDisplacement.slnInclude és library útvonalak beállításaWorking directory beállításaFordítFuttat

Page 3: Displacement mapping

Próba

Page 4: Displacement mapping

Material schemematerial Phong{

technique

{

scheme VeryLow

pass : PhongPass

…OIS::InputManager* OISInputManager;int schemecount = 1;int currentScheme = 0;String qualitySchemes[] = {

"VeryLow","Low","Medium","Height","VeryHeight","Ultra"

};…void setupScene(){ … renderWindow->setActive(true); renderWindow->getViewport(0)->setMaterialScheme(qualitySchemes[0]); …

Page 5: Displacement mapping

Minden sémához új technika a phong.material-ba

Minden technikának új pixel shadert írunk(ha implementáltunk egy új sémát

schemecount ++)

if( mKeyboard->isKeyDown(OIS::KC_SPACE) && mTimeUntilNextToggle < 0){

currentScheme = (++currentScheme)%schemecount;renderWindow->getViewport(0)->setMaterialScheme(qualitySchemes[currentScheme]);mTimeUntilNextToggle = 0.2f;

}

Page 6: Displacement mapping

Próba

Page 7: Displacement mapping

normal mappingmaterial Phong

{

technique

{

scheme VeryLow

}

technique

{

scheme Low

pass

{

vertex_program_ref PhongShadingDisplacedVS

{

}

fragment_program_ref PhongShadingNormalMappedPS

{

}

}

}

}

Page 8: Displacement mapping

Phong.programvertex_program PhongShadingVS hlsl{}fragment_program PhongShadingPS hlsl{}

vertex_program PhongShadingDisplacedVS hlsl{ source PhongDisplaced.hlsl entry_point displacedVS target vs_2_0}fragment_program PhongShadingNormalMappedPS hlsl{ source PhongDisplaced.hlsl entry_point normalMappedPS target ps_2_0}

Page 9: Displacement mapping

PhongDisplaced.hlslstruct VERTEX_IN{

float4 position : POSITION;float4 normal : NORMAL;float2 texCoord : TEXCOORD0;float4 tangent : TANGENT;float4 binormal : BINORMAL;

};

struct VERTEX_OUT{

float4 hPos : POSITION;float3 N : TEXCOORD0;float3 L : TEXCOORD1;float3 V : TEXCOORD2;float2 texCoord : TEXCOORD3;float3 T : TEXCOORD4;float3 B : TEXCOORD5;

};

Page 10: Displacement mapping

VERTEX_OUT displacedVS(VERTEX_IN In,uniform float4x4 worldViewProj,uniform float4x4 worldView,uniform float4x4 worldViewIT,uniform float4 lightPos)

{ VERTEX_OUT Out = (VERTEX_OUT) 0;

Out.hPos = mul(worldViewProj, In.position); Out.texCoord = In.texCoord; Out.V = -mul(worldView, In.position).xyz; Out.L = lightPos.xyz + lightPos.w * Out.V; Out.N = mul(worldViewIT, In.normal).xyz; Out.T = mul(worldViewIT, In.tangent).xyz; Out.B = mul(worldViewIT, In.binormal).xyz; return Out;}

Page 11: Displacement mapping

sampler2D colorTex : register(s0);sampler2D normalMap : register(s1);float4 amientLightColor;float4 diffuseLightColor;float4 specularLightColor;float4 lightAttenuation;float4 ambientColor;float4 diffuseColor;float4 specularColor;float4 emissiveColor;float HEIGHT_SCALE = 0.1;float HEIGHT_BIAS = -0.08;float bumpScale = 1;float4 normalMappedPS(VERTEX_OUT In):COLOR0{

float3 N = normalize(In.N);float3 T = normalize(In.T);float3 B = normalize(In.B);

float3x3 TangentToView = float3x3(T, B, N);

float3 Nt = normalize(tex2D(normalMap, In.texCoord).xyz - float3(0.5, 0.5, 0.0));Nt.z /= bumpScale;Nt = normalize(Nt);N = mul(Nt, TangentToView);

//innentől ugyanaz, mint a sima phong shaderünk… következő dia

float2 dtdx = ddx(In.texCoord);float2 dtdy = ddy(In.texCoord);float3 dpdx = ddx(-In.V);float3 dpdy = ddy(-In.V);

float3 T = normalize(dpdx * dtdy.y - dpdy * dtdx.y);float3 B =normalize(dpdy * dtdx.x - dpdx * dtdy.x) ;float3 N = cross(T, B);N *= sign(-dot(N, -In.V));

Page 12: Displacement mapping

…float d = length(In.L);float3 L = In.L / d;float3 V = normalize(In.V);

float4 texColor = tex2D(colorTex, In.texCoord);

float attenuation = 1.0 / (lightAttenuation.y + lightAttenuation.z * d + lightAttenuation.w * d * d);

float4 ambient = amientLightColor * ambientColor;float4 diffuse = max(0,dot(N,L)) * diffuseColor * diffuseLightColor * attenuation;float3 H = normalize(L + V);float4 specular = pow(max(0, dot(N,H)), specularColor.w)

* float4(specularColor.xyz, 1) * specularLightColor * attenuation;

return texColor * (ambient + diffuse) + specular + emissiveColor;}

Page 13: Displacement mapping

Próba (int schemecount = 2;)

Page 14: Displacement mapping

Parallax Mappingfloat4 parallaxMappedPS(VERTEX_OUT In):COLOR0{

…float3 Nt = normalize(tex2D(normalMap, In.texCoord).xyz - float3(0.5, 0.5, 0.0));

float d = length(In.L);float3 L = In.L / d;float3 V = normalize(In.V);

float3 Vt = mul(TangentToView, V); float h = tex2D(normalMap, In.texCoord).a * HEIGHT_SCALE + HEIGHT_BIAS;//In.texCoord += h * Vt.xy / Vt.z; //parallax //In.texCoord += h * Vt.xy; //parallax with offset limitIn.texCoord += h * Nt.z * Vt.xy; //parallax with slope

Nt = normalize(tex2D(normalMap, In.texCoord).xyz - float3(0.5, 0.5, 0.0));Nt.z /= bumpScale;Nt = normalize(Nt);N = mul(Nt, TangentToView);

float4 texColor = tex2D(colorTex, In.texCoord);float attenuation = …

Page 15: Displacement mapping

Próba (int schemecount = 3;)

Page 16: Displacement mapping

Iteratív parallax#define PARALLAX_ITERATION 5

float2 PARALLAX_MAPPING_ITER(float3 TexCoord, float3 View){ for(int i = 0; i < PARALLAX_ITERATION; i++) {

float3 N = tex2D(normalMap, TexCoord).xyz;

float h = tex2D(normalMap, TexCoord).a * HEIGHT_SCALE + HEIGHT_BIAS;

TexCoord += (h - TexCoord.z) * N.z * View;}return TexCoord.xy;

}

float4 iterativeParallaxMappedPS(VERTEX_OUT In):COLOR0{…

float3 Vt = mul(TangentToView, V); In.texCoord = PARALLAX_MAPPING_ITER(float3(In.texCoord, 0), Vt);

float4 texColor = tex2D(colorTex, In.texCoord);

Page 17: Displacement mapping

Próba (int schemecount = 4;)

Page 18: Displacement mapping

Relief mappingfloat4 reliefMappedPS(VERTEX_OUT In):COLOR0{

float3 Vt = mul(TangentToView, V); float3 sRange = -Vt * HEIGHT_SCALE / Vt.z * 0.5;float3 sPos = float3(In.texCoord, 0) - sRange;

for( int i=0; i<12; i++ ){

float bump = tex2D(normalMap, sPos.xy).a;sRange *= 0.5;if (sPos.z > bump * HEIGHT_SCALE) // If outside

sPos += sRange; // Move forwardelse

sPos -= sRange; // Move backward}In.texCoord = sPos.xy;

float4 texColor = tex2D(colorTex, In.texCoord);

Page 19: Displacement mapping

Próba (int schemecount = 5;)

Page 20: Displacement mapping

Relief mapping + árnyékokfloat4 reliefShadowMappedPS(VERTEX_OUT In):COLOR0

{

for( int i=0; i<12; i++ )

{

}

In.texCoord = sPos.xy;

float shadow = 1.0;

float h1 = sPos.z;

float h = tex2D(normalMap, In.texCoord).a;

float3 Lt = mul(TangentToView, L);

sRange = -Lt * HEIGHT_SCALE / Lt.z * 0.5;

sPos -= sRange * (1.0 - h - 0.5);

Page 21: Displacement mapping

Folytatás…for( int i=0; i<10; i++ ){

float bump = tex2D(normalMap, sPos.xy).a;sRange *= 0.5;if (sPos.z > bump * HEIGHT_SCALE) // If outside

sPos += sRange; // Move forwardelse

sPos -= sRange; // Move backward}float h2 = sPos.z;if(h2 > h1 + 0.01) shadow = 0.3;

float4 texColor = tex2D(colorTex, In.texCoord);…

float attenuation = …attenuation *= shadow;

Page 22: Displacement mapping

Próba (int schemecount = 6;)