% Tests for 1.x bump environment mapping instructions. % The main function of texbem/texbeml is to slightly perturb the texture % coordinates. We could in theory test the perturbed texture coordinates simply % by setting up a linear filter between two pixels and testing what value is % returned, but unfortunately linear filtering doesn't actually have arbitrary % precision between two given pixels, and in practice the precision can be low. % Instead we'll need to use a large source texture. Since we can't feasibly % specify that much data by hand, we set up an initial rendering pass to fill % the source texture with the right values. [require] shader model < 3.0 [rtv 0] format r32g32b32a32-float size (2d, 1000, 1000) [sampler 0] filter point point point address clamp clamp clamp [sampler 1] filter linear linear linear address clamp clamp clamp [srv 0] size (2d, 2, 1) 0.1 0.2 0.3 0.4 0.4 0.3 0.2 0.1 [srv 1] size (2d, 1000, 1000) [vertex shader] void main(inout float4 pos : position, out float4 tex : texcoord) { tex = (pos + 1) / 2; } [pixel shader] float4 main(float4 tex : texcoord) : color { /* Compensate for the pixel center. */ tex.x += (0.5 / 1000.0); tex.y -= (0.5 / 1000.0); return float4(tex.yx, 1.0 - tex.xy); } [test] draw quad copy rtv 0 srv 1 [vertex shader] void main(inout float4 pos : position, out float4 tex0 : texcoord, out float4 tex1 : texcoord1) { tex0 = (pos + 1) / 2; tex1 = float4(0.2, 0.3, 0.4, 0.5); } [pixel shader d3dbc-hex] % TODO: Convert to assembly. ffff0101 % ps_1_1 00000042 b00f0000 % tex t0 00000043 b00f0001 b0e40000 % texbem t1, t0 00000001 800f0000 b0e40001 % mov r0, t1 0000ffff % end [test] bump 1 f32(0.1, 0.2, 0.3, 0.5) 2.0 0.3 projected 1 disable draw quad % WARP transposes the matrix for TEXBEM/TEXBEML, but not for BEM. if(!warp) probe (250, 500) f32(0.58, 0.27, 0.73, 0.42) 32 if(!warp) probe (750, 500) f32(0.47, 0.33, 0.67, 0.53) 16 projected 1 enable draw quad if(!warp) probe (250, 500) f32(0.28, 0.47, 0.53, 0.72) 32 if(!warp) probe (750, 500) f32(0.17, 0.53, 0.47, 0.83) 16 [pixel shader d3dbc-hex] % TODO: Convert to assembly. ffff0101 % ps_1_1 00000042 b00f0000 % tex t0 00000044 b00f0001 b0e40000 % texbeml t1, t0 00000001 800f0000 b0e40001 % mov r0, t1 0000ffff % end [test] bump 1 f32(0.1, 0.2, 0.3, 0.5) 2.0 0.3 projected 1 disable draw quad % Besides transposing the matrix, WARP also uses the texcoord t1.z (0.4) % as a luminance factor, instead of the textured value t0.z (0.3 or 0.2). if(!warp) probe (250, 500) f32(0.522, 0.243, 0.657, 0.378) 32 if(!warp) probe (750, 500) f32(0.329, 0.231, 0.469, 0.371) 16 projected 1 enable draw quad if(!warp) probe (250, 500) f32(0.252, 0.423, 0.477, 0.648) 32 if(!warp) probe (750, 500) f32(0.119, 0.371, 0.329, 0.581) 32 [pixel shader d3dbc-hex] % TODO: Convert to assembly. ffff0104 % ps_1_4 00000051 a00f0000 3dcccccd 3e4ccccd 3e99999a 3ecccccd % def c0, 0.1, 0.2, 0.3, 0.4 00000051 a00f0001 3e99999a 3ecccccd 3f000000 3f19999a % def c1, 0.3, 0.4, 0.5, 0.6 00000001 800f0000 a0e40000 % mov r0, c0 00000001 800f0001 a0e40001 % mov r1, c1 % Note that NVidia will crash if we use c0/c1 directly here. 00000059 80030002 80e40001 80e40000 % bem r2.xy, r1, r0 00000001 80030000 80e40002 % mov r0.xy, r2 0000ffff % end [test] bump 2 f32(0.2, 0.3, 0.5, 0.6) 2.0 0.3 draw quad probe (320, 240) f32(0.42, 0.55, 0.3, 0.4) 1