Download presentation
Presentation is loading. Please wait.
1
Normal Map Compression with ATI 3Dc™
Jonathan Zarge ATI Research Inc.
2
Overview Normal mapping Normal map compression techniques
DXT compression ATI 3Dc™ Swizzled DXT5 compression
3
Normal Mapping Increase visual realism Reduce geometric size of models
Create detail by simulating geometry More efficient than dense geometry Textures provide lighting (normal) information Used in Half-Life 2, Doom 3, and Far Cry
4
Car Paint Demo
5
Traditional Lighting Model
Normals interpolated across triangle and lighting values calculated at each pixel Lighting values calculated at vertices and then interpolated across triangle n0
6
Normal Map Lighting nx nx nz (nx,nx,nz) 3 component normal
Lighting values calculated at each pixel using normal read from normal map (nx,nx,nz) nx nx nz 3 component normal map texture
7
World Space vs. Tangent Space
Triangle normal = (-0.6,-0.3,0.74) z y x Triangle normal can be any normalized vector x y z Triangle normal = (0,0,1) Coordinate space of normal defined by triangle orientation z component of normal map texel must be positive
8
Example Tangent Space Normal Maps
Tangent space normal maps are blue because a “Z” vector, (0,0,1) is represented as (127,127,255) as a color and the normals within a triangle are usually close to the normal of the “flat” triangle. Tangent space normal maps can be efficiently compressed
9
Generating Normal Maps
10
Normal Mapping Drawbacks
Low angle views distorted Silhouette edges do not have detail High texture bandwidth required Large amount of texture memory DXT compression not optimal for normal maps
11
Benefits of Normal Map Compression
More detailed normal maps More normal maps Memory and bandwidth can be diverted to other resources Smaller media size
12
Normal Map Compression Techniques
Lower precision texture formats Texture formats with fewer channels Denormalization Palletization Direct DXT compression ATI 3Dc™ Swizzled DXT5
13
DXT Compression Designed to compress color data
No suited for arbitrary data One channel dependent on another Lossy format Image divided into 4x4 pixel blocks 16 possible colors in block Only 3 or 4 colors in compressed data Local similarity in small region enables high quality color compression Each 4x4 block has a mini-palette of 3 or 4 colors For normals, high frequency changes are the desired use
14
DXT Compression Color Block
Image divided into 4x4 blocks Two 16-bit colors stored representing endpoints of linear color-ramp One or two interpolated colors calculated 16 two-bit indices stored representing index into color ramp Effective bit-rate: 64 (2*16 +16*2) / 16 = 4 bits per pixel
15
DXTC Color Compression
CYAN WHITE BLUE MAGENTA Interpolated Colors GREEN YELLOW BLACK RED
16
DXTC Color Decompression
For the four color case, given color[0], color[1], and index[1..15]: // calculating interpolated colors color[2] = (2*color[0] + color[1] + 1)/3 color[3] = (color[0] + 2*color[1] + 1)/3 // decompressed texel values for n = 0 to 15 texel[n] = color[index[n]]
17
DXT5 Compression Alpha Block
Like color, image divided into 4x4 blocks Two 8-bit scalars stored representing endpoints of linear alpha-ramp 4 or 6 intermediate alpha values calculated 16 three-bit indices stored representing index into alpha ramp Effective bit-rate: 64 (2*8 +16*3) / 16 = 4 bits per pixel
18
DXTC Alpha Decompression
For the 8 alpha value case, given alpha[0], alpha[1], and index[1..15]: // calculating interpolated alpha values alpha[2] = (6*alpha[0] + 1*alpha[1] + 3)/7 alpha[3] = (5*alpha[0] + 2*alpha[1] + 3)/7 .. alpha[7] = (1*alpha[0] + 6*alpha[1] + 3)/7 // decompressed texel values for n = 0 to 15 texel[n] = alpha[index[n]]
19
Using DXT Compression for Normal Maps
Not a good idea! Block artifacts Normals describe curved surfaces, not lines Especially visible in diagonal gradients Colors stored in format Fine detail lost Errors are amplified for specular lighting Storage is inefficient because normalized vectors can be stored in two values
20
ATI 3Dc™ Texture Format Two independent channel texture format
Exposed in D3D via the FOURCC code “ATI2” Composed of 2 DXT5 alpha blocks Extremely useful for normal textures Compression: 4:1 for 32 bit textures 2:1 for 16 bit textures
21
Ruby Demo
22
ATI 3Dc™ Texture Format Decompression accomplished in hardware
Almost no impact on performance Can be used for two unrelated scalars e.g. shininess, refractive index, transparency Library for compressing to 3Dc™ available from ati.com/developer Available in OpenGL using the GL_ATI_texture_compression_3dc extension
23
ATI 3Dc™ Texture Format
24
Using ATI 3Dc™ with Normal Maps
x and y (of normal) stored in the texture z value calculated by x2 + y2 + z2 = 1 z = ±sqrt(1 – x2 – y2) Only positive root used because normal is in tangent space Calculation done in pixel shader Can also be derived by a texture lookup Single channel z component texture
25
Using ATI 3Dc™ Pixel shader 2.0 code: ; scale, bias, half, one
def c0, 2.0f, -1.0f, 0.5f, 1.0f . texld r1, t1, s1 ;normal map mad r1, r1, c0.x, c0.y ; scale/bias to -1,1 ; Compute third component dp2add r1.z, r1, -r1, c0.w ; 1-x*x-y*y rsq r1.z, r1.z ; 1 / sqrt(1-x*x-y*y) rcp r1.z, r1.z ; sqrt(1-x*x-y*y)
26
Using ATI 3Dc™ Pixel shader code (HLSL): sampler bump_map;
float4 ps_main( PS_INPUT_STRUCT psInStruct ) :COLOR0 { // Unpack two component bump map float3 bump = tex2D( bump_map, psInStruct.bump_map ); // Put x and y in range and compute z bump = ( bump * 2.0f ) - 1.0f; bump.z = sqrt(1 - dot(bump.xy, bump.xy)); .
27
ATI 3Dc™ Compression Comparison
28
ATI 3Dc™ Normal Compression Sample
29
Drawbacks of ATI 3Dc™ Can only represent tangent space normal maps
Cannot represent high precision normal maps Large areas of low curvature (car hood) may require 16 bits per component More pixel shader instructions required Not available on all hardware
30
Normal Map Compression Using Swizzled DXT5
For any hardware with at least ps 1.4 support Store x and y in alpha and green channels of the texture map Shader similar to 3Dc™ with one extra pixel shader instruction Results better than using DXTC directly but not as good as 3Dc™
31
Using DXT5 Compression Pixel shader 2.0 code: ;scale, bias, half, one
def c0, 2.0f, -1.0f, 0.5f, 1.0f . texld r1, t1, s1 ;normal map mov r1.x, r1.a ; restore x from alpha mad r1, r1, c0.x, c0.y ; scale/bias to -1,1 ; Compute third component dp2add r1.z, r1, -r1, c0.w ; 1-x*x-y*y rsq r1.z, r1.z ; 1 / sqrt(1-x*x-y*y) rcp r1.z, r1.z ; sqrt(1-x*x-y*y)
32
DXT5 Normal Map Compression RenderMonkey Example
33
Summary Normal Mapping great feature
Directly using DXT compression not great for normal textures Compression with 3Dc™ lowers the cost normal mapping 3Dc™ available in D3D and OpenGL Swizzled DXT5 compression reasonable alternative for older hardware
34
QUESTIONS? Email me jzarge@ati.com or devrel@ati.com
More information available at ati.com/developer Please go see Chris Oat’s talk on “Advanced Character Rendering” Saturday, 10:25am
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.