From Bo3b's School for Shaderhackers
Jump to: navigation, search

Lesson 0

Hopefully the beginning of a productive and helpful undertaking. Wish me luck!

TheBall02 50.jpg

Lesson 1

Took a while to get the shaders to dump. Thankfully reading the forum thread helped me find the answer to simply launch the .exe from the folder. Might be a good idea to mention this as a possible hiccup in the lesson!

Here is the pixel shader that I dumped, which is for the bloom effect around certain lights.

// Generated by Microsoft (R) HLSL Shader Compiler 9.27.952.3022
// Parameters:
//   float4 AmbientColorAndSkyFactor;
//   float4 MinZ_MaxZRatio;
//   sampler2D Texture2D_0;
//   sampler2D Texture2D_1;
//   sampler2D Texture2D_2;
//   sampler2D Texture2D_3;
//   float4 UniformPixelVector_0;
//   float4 UniformPixelVector_1;
//   float4 UniformPixelVector_2;
// Registers:
//   Name                     Reg   Size
//   ------------------------ ----- ----
//   UniformPixelVector_0     c0       1
//   MinZ_MaxZRatio           c2       1
//   UniformPixelVector_1     c4       1
//   UniformPixelVector_2     c5       1
//   AmbientColorAndSkyFactor c6       1
//   Texture2D_0              s0       1
//   Texture2D_1              s1       1
//   Texture2D_2              s2       1
//   Texture2D_3              s3       1

    def c1, 2, -1, 0.200000003, 9.99999997e-007
    def c3, 0.200000003, 0.100000001, 0, 3
    def c7, 7.5, 3, 0.375, 1.5
    def c8, 5, 2, 0.25, 0
    def c9, 0.816496611, 0.577350259, 0, 0.600000024
    def c10, -0.707106769, -0.408248305, 0.577350259, 0.707106769
    dcl_texcoord5 v2.w
    dcl_texcoord v4.xy
    dcl_2d s0
    dcl_2d s1
    dcl_2d s2
    dcl_2d s3
    nrm, v3
    texld r1, v4, s0
    mad_pp, r1, c1.x, c1.y
    nrm_pp, r1
    dp3 r0.w, r2, r0
    mul, r0.w, r2
    mad, r1, c1.x, -r0
    dp2add_sat_pp r1.x, r0.yzzw, c9, c9.z
    dp3_sat_pp r1.y, r0, c10
    dp3_sat_pp r1.z, r0.yzxw, c10.yzww
    max, r1, c1.w
    mul, r0, r0
    mul, r1, r1
    mul, r1, r1
    mul, r1, r1
    mul, r1, r1
    mul_pp, r0, r1
    dp3_pp r0.x, v1, r0
    mov r0.y, c3.y
    add r0.z, r0.y, c5.x
    cmp_sat r0.y, c5.x, r0.z, r0.y
    texld r1, v4, s1
    mul r0.y, r0.y, r1.w
    mul, r1, c9.w
    mad r0.yzw, r0.y, c8.xxyz, -r1.xxyz
    mad r0.yzw, r1.w, r0, r1.xxyz
    mul, r0.yzww, r1
    mul_pp, r1, v0
    mul_pp, r1, c3.w
    mul_pp, r0.x, r1
    dp2add_sat_pp r3.x, r2.yzzw, c9, c9.z
    dp3_sat_pp r3.y, r2, c10
    dp3_sat_pp r3.z, r2.yzxw, c10.yzww
    mul_pp, r3, r3
    max_pp, r2, c1.w
    dp3_pp r0.x, v1, r3
    mul r2.xy, c3.w, v4
    texld r2, r2, s3
    mul, r2, c7.w
    mul r0.yzw, r0, r2.xxyz
    mov r2.yz, c1
    add r2.xyw, -r2.y, -c0.xyzz
    mul_pp r0.yzw, r0, r2.xxyw
    mul_pp r2.xyw, r0.yzzw, v0.xyzz
    mad_pp, r2.xyww, r0.x, r1
    mad r2.xy, v4, r2.z, c4
    texld r2, r2, s2
    add r0.x, r2.y, r2.y
    mul r0.x, r1.w, r0.x
    mul, r1.w, c3
    mad, r0.x, c7, r2
    mov, c0
    mad_pp, c5.x, r2, r3
    add_pp, r1, r2
    mad_pp, r0.yzww, c6, r1
    rcp r0.x, v2.w
    mad_pp oC0.w, c2.x, r0.x, c2.y

// approximately 63 instruction slots used (4 texture, 59 arithmetic)

Lesson 2

Disabling broken bloom effect. Easy enough to follow, but only understand about half of it. Hope more understanding will come.
Before: RK - TheBall - Broken bloom on.jpg After: RK - TheBall - Broken bloom off.jpg

Lesson 3

Figured it out, despite the explanation behind certain things being extremely lacking/vague. Glad I have some basic programming knowledge to help me get this far, otherwise going off the lesson info alone I wouldn't have been able to do this.

From DX9Settings.ini


// UseRenderedShaders=true is nearly always useful, because it trims the 
// list of shaders seen while hunting down to just those active in the 
// current scene.  Disable this only if you get crashes during hunting.

// DumpAll will generate ASM text files for every shader seen by the game.
// This is usually worth doing once, but not useful for every run.

// Constant registers that will arrive in Vertex and Pixel Shaders, as
// c220.  The constants below will be assigned, based on the key preset.
DefVSConst1 = 220  		
DefPSConst1 = 220

// The PresetKeysList specifies which KEYs will be used.
// Multiple keys lists are supported.
PresetsKeysList = 1;

// For this single key example, we only need one keylist, KEY1. This specifies
// that the Numpad 0 keyboard key (Key=96) should act as a toggle. And toggle
// between the two Presets of PRES1, PRES2.  Which will change the Const1 being 
// passed to the shader code from 1.0 to 0.0 as floating point numbers.
// Type=1 is toggle, Type=2 is momentary.
Key = 110
Presets = 1;2;
Type = 2

// Constants that will be sent to every shader through constant register c220.
// The Const1 tells us that we'll need to use c220.x to compare against these
// values.  Const2 would be seen as c220.y.
// 0x3f800000 is 1.0 in floating point hex, 0x00000000 is 0.0 in hex
// UseByDef specifies which constant is the default starting value.
Const1 = 0x3f800000
Const1 = 0x00000000

From A977E84A.txt

// Annoying bloom on ball light
// Generated by Microsoft (R) HLSL Shader Compiler 9.27.952.3022
// Parameters:
//   sampler2D Texture2D_0;
//   float UniformPixelScalar_7;
//   float4 UniformPixelVector_0;
//   float4 UniformPixelVector_3;
//   float4 UniformPixelVector_4;
//   float4 UniformPixelVector_5;
//   float4 UniformPixelVector_6;
// Registers:
//   Name                 Reg   Size
//   -------------------- ----- ----
//   UniformPixelVector_0 c0       1
//   UniformPixelVector_3 c4       1
//   UniformPixelVector_4 c5       1
//   UniformPixelVector_5 c6       1
//   UniformPixelVector_6 c7       1
//   UniformPixelScalar_7 c8       1
//   Texture2D_0          s0       1

    def c1, 0.5, 1, -0.5, 0
    def c2, 3, 0, 0, 0
	//def c220, Const1, Const2, Const3, Const4
	def c200, 0, 1, 0.0625, 0	// x=0 for comparison to Const1
    dcl_texcoord v0.xy
    dcl_texcoord1 v1
    dcl_texcoord2 v2.y
    dcl_texcoord4 v3.w
    dcl_2d s0
    add r0.xy, c1.z, v0
    mov r0.w, c1.w
    dp2add r1.x, c5, r0, r0.w
    dp2add r1.y, c6, r0, r0.w
    add r0.xy, r1, c1.x
    texld r0, r0, s0
    mad_sat r0.y, v2.y, -c1.x, c1.y
    mul r0.yzw, r0.y, v1.xxyz
    mul r0.yzw, r0, v1.w
    mul_sat, r0.yzww, r0.x
    mul, r0, c4
    mad, c4, -r0, r0
    mad, c8.x, r0, r1
    mul, r0, c4.w
    mul, r0, c7
    mov r1.x, c2.x
    mad_pp, r0, r1.x, c0
    mul_pp, r0, v3.w
    mov oC0.w, c1.w
// Disable game-breaking bloom effect
// if Const1 = 0 disable effect, else leave it on
mov r30.x, c220.x
if_eq r30.x, c200.x
mov oC0.xyzw, c200.wwww
mov oC0.xyzw, c200.yyww
// approximately 21 instruction slots used (1 texture, 20 arithmetic)

RK - TheBall01 - L3 Const.jpg