six 2D textures

Transcrição

six 2D textures
Bachelor Praktikum:
Echtzeitgraphik in C++ und DirectX10
computer graphics & visualization
Proto-Texturing
• Idea:
– Set of textures that serve as prototypes for different
materials (e.g. sand, grass, rock, snow, etc.)
– Height/slope-dependent weighting function to
decide how the textures are blended for a single
fragment
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Proto-Texturing
• Pre-Processing:
– Store the precomputed weight
function in a RGBA-texture
Slope
– Weights for the different
materials are stored in the
distinct color channels
– Sum of weights should be 1
Height
Sand
Grass
Rock
Snow
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Proto-Texturing
• How to texture a specific fragment?
1. Use height and slope as texture
coordinates to determine the
according weights
2. Use xz-coordinate as (scaled)
texture coordinate to access the
proto textures
3. Fetch samples from the proto
textures and blend them according
to the given weights
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Environment Mapping
• An “advanced texturing” method in computer
graphics, which is used to
approximate reflections in
curved surfaces
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Cubic Environment Mapping
• Idea:
– The Environment Map is
composed of six 2D textures,
representing the view from
the center of the box in the
orthogonal viewing directions
– Object is thought to be placed
at the center of the box and
the direction of the reflectance rays are used to
determine the reflected color of the environment
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Cubic Environment Mapping
• Assumptions:
– Object is at the center of the cube
– Distance between object and cube (and its pictured
surroundings) is (near) infinity (or far enough)
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Cubic Environment Mapping
• Given:
– normal n, position p (-> view vector v)
• Approach:
1. Compute reflection vector r
2. Assuming that p is in the center of the cube:
• Largest component and sign determines the cube face
• The two other components are adapted to the texture
space and devided by the largest component in order to
get the texture coordinates within the cube face.
• Note: cube map sampling is directly supported by HLSL!
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Using Cubemaps
Application (Loading the resource):
Use the D3DX10CreateShaderResourceViewFromFile() function and cubemaps
in .dds Format (available on the couse homepage), so DirectX will automatically
create CubeMap resouce (Texture2DArray with special settings...)
HLSL sample code to access a cube map resource:
TextureCube2D myCubeMap;
//the Cube Map
float4 PSTextured(float4 pos : SV_Position, float3 wp : WORLDPOS, float3 normal : NORMAL) : SV_Target0{
//Calculate reflection vector based on incident view direction and surface normal
float3 incident = normalize(g_vEyePos - wp);
float3 R = reflect(incident, normalize(normal));
return myCubeMap.Sample( mySampler, R ).rgba; // a 3 component vector is needed to sample a cubemap
}
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Environment
How can we colorize the background with the cubemap ?
Render „SkyBox or SkyDome“ textured with CubeMap Faces
Render single quad covering the whole viewport and calculate cubemap
intersection analytically
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Environment
(0,0)
(Width-1,0)
(1,0)
(1,2)
(0.143,0.111)
(0,Height-1)
(0,1)
(Width-1,Height-1)
(1,1)
Inside a pixelshader we can always access the system value SV_Position, whose
x and y components contain a fragments position in texelcoordinates !
Normalize those values trough division by (Width-1, Height-1)
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Environment
Normalized Device Coordinates (a position projected onto the imageplane,
after perspective transformation and dehomogenization) range from [-1,1] in
the xy-Domain (plus a nonlinear depthvalue for z-Testing)
(-1,1)
x
(1,1)
y
(0,-1)
(1,-1)
Shift Coordinates into NDC range: x = 2∙x -1, y = 1-2∙y
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Environment
• We also know that the Camera is located at the origin of the view coordinate system
and looks down the +z-Axis.
• Based on camera parameters we can transform NDC coordinates into a vector from
the camera trought the image plane by scaling the normalized device coordinates
accordingly („fan out the view rays...“!)
x
1
FoV
-1
y
Vec3 ViewVec= Vec3(AspectRatio∙tan(0.5f∙FieldOfView)∙x, tan(0.5f∙FieldOfView)∙y, 1.0f);
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Environment
• Multiplication with the inverse View-Matrix then transforms the
view rays back to worldspace, where they can be used as
CubeMap-Lookup coordinates.
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization
Assignment 7
1. Proto-Textures:
–
–
–
–
Different tetures for sand, grass, rock, snow.
Pre-process weights and write them into a texture.
Use Height/slope to determine weights.
Use weights to blend the different material textures.
2. Cubic Environment Mapping
– Create a water surface on a specific height.
– Use cube map to approximate the reflexions of the
environment on the water surface.
3. Environment
– Use the cube map to render the environment around the
terrain.
3D Praktikum WS 2009/2010 – Echtzeitgraphik in C++ und DirectX10
K. Bürger, S. Auer, Prof. Dr. Westermann
computer graphics & visualization