I’m trying to use RenderDoc to understand how a DirectX11 game engine’s vertex shader works, and ultimately recover the world-space positions of vertices. I have captured a frame using RenderDoc, and can view the Vertex Shader stage in the pipeline;
As you can see in my screenshot, there are 9 matrices stored in the per-view constant buffer;
- cb_ViewOrigin.TangentMatrix
- cb_mDeviceToViewport
- cb_mViewToDevice
- cb_mInverseView
- cb_mProjToDevice
- cb_mInverseProj
- cb_mViewProj
- cb_mNoNearProj
- cb_mNoFarProj
I understand that these matrices will be multiplied in a transformation chain to convert the model space vertices to homogeneous screen-space coordinates, but I am having trouble guessing which matrices from the list above correspond to which stages in the pipeline (e.g. I’m not sure what the ‘device’ matrices are). My understanding is that the standard DirectX11 transform chain looks something like this;
Model -> World -> Camera -> Viewport -> Screen
Can anyone tell me which matrices from the above list might correspond to stages in a transform chain? At the moment my best guess is;
Model *??? -> World
World *??? -> Camera
Camera * cb_mViewProj * cb_mProjToDevice * cb_mDeviceToViewport -> Viewport
Viewport * ??? -> Screen
P.S. If it helps, the disassembled Vertex Shader code from RenderDoc is as follows;
Shader hash 2d9d1254-a66b22a7-8cc39880-b2ee4813
vs_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb2[23], immediateIndexed
dcl_constantbuffer cb3[39], immediateIndexed
dcl_constantbuffer cb7[1], immediateIndexed
dcl_resource_buffer (float,float,float,float) t12
dcl_input v0.xyzw
dcl_input v1.xyz
dcl_input v2.xy
dcl_input v3.x
dcl_output_siv o0.xyzw, position
dcl_output o1.xyzw
dcl_output o2.xy
dcl_output o3.xyz
dcl_output o4.xyz
dcl_output o5.xyzw
dcl_output o6.xyzw
dcl_output_siv o7.x, clipdistance
dcl_output_siv o7.y, culldistance
dcl_temps 8
0: iadd r0.xyzw, v3.xxxx, l(1, 2, 3, 4)
1: ld_indexable(buffer)(float,float,float,float) r1.xyz, r0.yyyy, dataBuffer.xyzw
2: iadd r1.xyz, r1.xyzx, -cb_ViewOrigin.PositionMeters.xyzx
3: itof r1.xyz, r1.xyzx
4: ld_indexable(buffer)(float,float,float,float) r2.xyz, r0.zzzz, dataBuffer.xyzw
5: add r2.xyz, r2.xyzx, -cb_ViewOrigin.SubMeterOffset.xyzx
6: add r1.xyz, r1.xyzx, r2.xyzx
7: mul r2.xyz, r1.yyyy, cb_ViewOrigin.TangentMatrix[1].xyzx
8: mad r1.xyw, r1.xxxx, cb_ViewOrigin.TangentMatrix[0].xyxz, r2.xyxz
9: mad r1.xyz, r1.zzzz, cb_ViewOrigin.TangentMatrix[2].xyzx, r1.xywx
10: add r1.xyz, r1.xyzx, cb_ViewOrigin.TangentMatrix[3].xyzx
11: iadd r2.xyz, v3.xxxx, l(5, 6, 7, 0)
12: ld_indexable(buffer)(float,float,float,float) r3.xyzw, r2.zzzz, dataBuffer.xyzw
13: mul r4.xyzw, r3.yyyy, cb_ViewOrigin.TangentMatrix[1].xyzw
14: mad r4.xyzw, r3.xxxx, cb_ViewOrigin.TangentMatrix[0].xyzw, r4.xyzw
15: mad r4.xyzw, r3.zzzz, cb_ViewOrigin.TangentMatrix[2].xyzw, r4.xyzw
16: mad r3.xyzw, r3.wwww, cb_ViewOrigin.TangentMatrix[3].xyzw, r4.xyzw
17: add r1.xyz, r1.xyzx, r3.xyzx
18: mul r4.xyzw, r1.yyyy, cb_mViewToDevice[1].xyzw
19: mad r4.xyzw, r1.xxxx, cb_mViewToDevice[0].xyzw, r4.xyzw
20: mad r4.xyzw, r1.zzzz, cb_mViewToDevice[2].xyzw, r4.xyzw
21: mad r3.xyzw, r3.wwww, cb_mViewToDevice[3].xyzw, r4.xyzw
22: mul r4.xyzw, r3.yyyy, cb_mNoNearProj[1].xyzw
23: mad r4.xyzw, r3.xxxx, cb_mNoNearProj[0].xyzw, r4.xyzw
24: mad r4.xyzw, r3.zzzz, cb_mNoNearProj[2].xyzw, r4.xyzw
25: mad r3.xyzw, r3.wwww, cb_mNoNearProj[3].xyzw, r4.xyzw
26: ld_indexable(buffer)(float,float,float,float) r4.xyzw, r2.xxxx, dataBuffer.xyzw
27: ld_indexable(buffer)(float,float,float,float) r2.xyzw, r2.yyyy, dataBuffer.xyzw
28: mul r5.xyzw, r4.yyyy, cb_ViewOrigin.TangentMatrix[1].xyzw
29: mad r5.xyzw, r4.xxxx, cb_ViewOrigin.TangentMatrix[0].xyzw, r5.xyzw
30: mad r5.xyzw, r4.zzzz, cb_ViewOrigin.TangentMatrix[2].xyzw, r5.xyzw
31: mad r4.xyzw, r4.wwww, cb_ViewOrigin.TangentMatrix[3].xzyw, r5.xzyw
32: mul r5.xyzw, r4.zzzz, cb_mViewToDevice[1].xyzw
33: mad r5.xyzw, r4.xxxx, cb_mViewToDevice[0].xyzw, r5.xyzw
34: mad r5.xyzw, r4.yyyy, cb_mViewToDevice[2].xyzw, r5.xyzw
35: mad r5.xyzw, r4.wwww, cb_mViewToDevice[3].xyzw, r5.xyzw
36: mul r6.xyzw, r5.yyyy, cb_mNoNearProj[1].xyzw
37: mad r6.xyzw, r5.xxxx, cb_mNoNearProj[0].xyzw, r6.xyzw
38: mad r6.xyzw, r5.zzzz, cb_mNoNearProj[2].xyzw, r6.xyzw
39: mad r5.xyzw, r5.wwww, cb_mNoNearProj[3].xyzw, r6.xyzw
40: mul r5.xyzw, r5.xyzw, v0.yyyy
41: ld_indexable(buffer)(float,float,float,float) r6.xyzw, r0.wwww, dataBuffer.xyzw
42: ld_indexable(buffer)(float,float,float,float) o6.xyzw, r0.xxxx, dataBuffer.xyzw
43: mul r0.xyzw, r6.yyyy, cb_ViewOrigin.TangentMatrix[1].xyzw
44: mad r0.xyzw, r6.xxxx, cb_ViewOrigin.TangentMatrix[0].xyzw, r0.xyzw
45: mad r0.xyzw, r6.zzzz, cb_ViewOrigin.TangentMatrix[2].xyzw, r0.xyzw
46: mad r0.xyzw, r6.wwww, cb_ViewOrigin.TangentMatrix[3].yxzw, r0.yxzw
47: mul r6.xyzw, r0.xxxx, cb_mViewToDevice[1].xyzw
48: mad r6.xyzw, r0.yyyy, cb_mViewToDevice[0].xyzw, r6.xyzw
49: mad r6.xyzw, r0.zzzz, cb_mViewToDevice[2].xyzw, r6.xyzw
50: mad r6.xyzw, r0.wwww, cb_mViewToDevice[3].xyzw, r6.xyzw
51: mul r7.xyzw, r6.yyyy, cb_mNoNearProj[1].xyzw
52: mad r7.xyzw, r6.xxxx, cb_mNoNearProj[0].xyzw, r7.xyzw
53: mad r7.xyzw, r6.zzzz, cb_mNoNearProj[2].xyzw, r7.xyzw
54: mad r6.xyzw, r6.wwww, cb_mNoNearProj[3].xyzw, r7.xyzw
55: mad r5.xyzw, v0.xxxx, r6.xyzw, r5.xyzw
56: mul r6.xyzw, r2.yyyy, cb_ViewOrigin.TangentMatrix[1].xyzw
57: mad r6.xyzw, r2.xxxx, cb_ViewOrigin.TangentMatrix[0].xyzw, r6.xyzw
58: mad r6.xyzw, r2.zzzz, cb_ViewOrigin.TangentMatrix[2].xyzw, r6.xyzw
59: mad r2.xyzw, r2.wwww, cb_ViewOrigin.TangentMatrix[3].xyzw, r6.xyzw
60: mul r6.xyzw, r2.yyyy, cb_mViewToDevice[1].xyzw
61: mad r6.xyzw, r2.xxxx, cb_mViewToDevice[0].xyzw, r6.xyzw
62: mad r6.xyzw, r2.zzzz, cb_mViewToDevice[2].xyzw, r6.xyzw
63: mad r6.xyzw, r2.wwww, cb_mViewToDevice[3].xyzw, r6.xyzw
64: mul r7.xyzw, r6.yyyy, cb_mNoNearProj[1].xyzw
65: mad r7.xyzw, r6.xxxx, cb_mNoNearProj[0].xyzw, r7.xyzw
66: mad r7.xyzw, r6.zzzz, cb_mNoNearProj[2].xyzw, r7.xyzw
67: mad r6.xyzw, r6.wwww, cb_mNoNearProj[3].xyzw, r7.xyzw
68: mad r5.xyzw, v0.zzzz, r6.xyzw, r5.xyzw
69: mad o0.xyzw, v0.wwww, r3.xyzw, r5.xyzw
70: mov r3.x, r0.w
71: mov r3.y, r4.w
72: mov r3.z, r2.w
73: dp3 r3.w, v1.xyzx, r3.xyzx
74: mov r5.x, r0.y
75: mov r5.y, r4.x
76: mov r5.z, r2.x
77: dp3 r3.x, v1.xyzx, r5.xyzx
78: mov r4.x, r0.z
79: mov r0.y, r4.z
80: mov r0.z, r2.y
81: mov r4.z, r2.z
82: dp3 r3.y, v1.xyzx, r0.xyzx
83: dp3 r3.z, v1.xyzx, r4.xyzx
84: dp4 r1.w, r3.xyzw, r3.xyzw
85: rsq r1.w, r1.w
86: mul r2.xyz, r1.wwww, r3.xyzx
87: dp3 r1.w, cb_mLights.mDirection.xyzx, cb_mLights.mDirection.xyzx
88: rsq r1.w, r1.w
89: mul r3.xyz, r1.wwww, cb_mLights.mDirection.xyzx
90: dp3_sat r1.w, r2.xyzx, r3.xyzx
91: mad r3.xyz, cb_mLights.mDiffuse.xyzx, r1.wwww, cb_mLights.mAmbient.xyzx
92: dp3 r1.w, cb2[22].yzwy, cb2[22].yzwy
93: rsq r1.w, r1.w
94: mul r6.xyz, r1.wwww, cb2[22].yzwy
95: dp3_sat r1.w, r2.xyzx, r6.xyzx
96: mov o4.xyz, r2.xyzx
97: mad r2.xyz, cb2[18].xyzx, r1.wwww, cb2[19].xyzx
98: add_sat o1.xyz, r2.xyzx, r3.xyzx
99: mov o1.w, l(1.000000)
100: mov o2.xy, v2.xyxx
101: mov r5.w, r1.x
102: dp4 r2.x, v0.xyzw, r5.xyzw
103: mov r0.w, r1.y
104: mov r4.w, r1.z
105: dp4 r2.z, v0.xyzw, r4.xyzw
106: dp4 r2.y, v0.xyzw, r0.xyzw
107: mov o3.xyz, r2.xyzx
108: ld_indexable(buffer)(float,float,float,float) o5.xyzw, v3.xxxx, dataBuffer.xyzw
109: mov r2.w, l(1.000000)
110: dp4 r0.x, r2.xyzw, cb_mUserClip.xyzw
111: utof r0.y, cb_mObjectType.x
112: add r0.y, r0.y, l(-1.000000)
113: min r0.y, abs(r0.y), l(1.000000)
114: mul r0.x, r0.y, r0.x
115: mov o7.x, r0.x
116: mov o7.y, r0.x
117: ret
And the full per-view constant buffer contents (CSV format) are;
Name,Value,Type
cb_ViewOrigin,,struct
cb_ViewOrigin.PositionMeters,"-5490205, 334708, 3218202",int3
cb_ViewOrigin.Radius,"0.00",float
cb_ViewOrigin.SubMeterOffset,"0.04482, 0.81586, 0.61739",float3
cb_ViewOrigin.ID,"0",uint
cb_ViewOrigin.TangentMatrix,,float4x4
TangentMatrix.TangentMatrix.row0,"0.06085, -0.86004, 0.50659, 0.00",float4
TangentMatrix.TangentMatrix.row1,"0.99815, 0.05243, -0.03088, 0.00",float4
TangentMatrix.TangentMatrix.row2,"0.00, 0.50753, 0.86164, 0.00",float4
TangentMatrix.TangentMatrix.row3,"0.00, 0.00, 0.00, 1.00",float4
cb_mDeviceToViewport,,float4x4
cb_mDeviceToViewport.cb_mDeviceToViewport.row0,"0.00131, 0.00, 0.00, 0.00",float4
cb_mDeviceToViewport.cb_mDeviceToViewport.row1,"0.00, -0.00106, 0.00, 0.00",float4
cb_mDeviceToViewport.cb_mDeviceToViewport.row2,"0.00, 0.00, 1.00, 0.00",float4
cb_mDeviceToViewport.cb_mDeviceToViewport.row3,"-1.00, 1.00, 0.00, 1.00",float4
cb_mViewToDevice,,float4x4
cb_mViewToDevice.cb_mViewToDevice.row0,"-0.9775, -0.00264, -0.21093, 0.00",float4
cb_mViewToDevice.cb_mViewToDevice.row1,"-0.00022, 0.99993, -0.01146, 0.00",float4
cb_mViewToDevice.cb_mViewToDevice.row2,"0.21095, -0.01115, -0.97743, 0.00",float4
cb_mViewToDevice.cb_mViewToDevice.row3,"0.00, 0.00, 0.00, 1.00",float4
cb_mInverseView,,float4x4
cb_mInverseView.cb_mInverseView.row0,"-0.9775, -0.00022, 0.21095, 0.00",float4
cb_mInverseView.cb_mInverseView.row1,"-0.00264, 0.99993, -0.01115, 0.00",float4
cb_mInverseView.cb_mInverseView.row2,"-0.21093, -0.01146, -0.97743, 0.00",float4
cb_mInverseView.cb_mInverseView.row3,"0.00, 0.00, 0.00, 1.00",float4
cb_mProjToDevice,,float4x4
cb_mProjToDevice.cb_mProjToDevice.row0,"0.99375, 0.00, 0.00, 0.00",float4
cb_mProjToDevice.cb_mProjToDevice.row1,"0.00, 0.80394, 0.00, 0.00",float4
cb_mProjToDevice.cb_mProjToDevice.row2,"0.00, 0.00, 1.00003, 1.00",float4
cb_mProjToDevice.cb_mProjToDevice.row3,"0.00, 0.00, -2.99174, 0.00",float4
cb_mInverseProj,,float4x4
cb_mInverseProj.cb_mInverseProj.row0,"1.00629, 0.00, 0.00, 0.00",float4
cb_mInverseProj.cb_mInverseProj.row1,"0.00, 1.24387, 0.00, 0.00",float4
cb_mInverseProj.cb_mInverseProj.row2,"0.00, 0.00, 0.00, -0.33425",float4
cb_mInverseProj.cb_mInverseProj.row3,"0.00, 0.00, 1.00, 0.33426",float4
cb_mViewProj,,float4x4
cb_mViewProj.cb_mViewProj.row0,"-0.97139, -0.00212, -0.21094, -0.21093",float4
cb_mViewProj.cb_mViewProj.row1,"-0.00022, 0.80389, -0.01146, -0.01146",float4
cb_mViewProj.cb_mViewProj.row2,"0.20963, -0.00896, -0.97746, -0.97743",float4
cb_mViewProj.cb_mViewProj.row3,"0.00, 0.00, -2.99174, 0.00",float4
cb_mNoNearProj,,float4x4
cb_mNoNearProj.cb_mNoNearProj.row0,"0.99375, 0.00, 0.00, 0.00",float4
cb_mNoNearProj.cb_mNoNearProj.row1,"0.00, 0.80394, 0.00, 0.00",float4
cb_mNoNearProj.cb_mNoNearProj.row2,"0.00, 0.00, 1.00003, 1.00",float4
cb_mNoNearProj.cb_mNoNearProj.row3,"0.00, 0.00, -0.10, 0.00",float4
cb_mNoFarProj,,float4x4
cb_mNoFarProj.cb_mNoFarProj.row0,"0.99375, 0.00, 0.00, 0.00",float4
cb_mNoFarProj.cb_mNoFarProj.row1,"0.00, 0.80394, 0.00, 0.00",float4
cb_mNoFarProj.cb_mNoFarProj.row2,"0.00, 0.00, 1.00, 1.00",float4
cb_mNoFarProj.cb_mNoFarProj.row3,"0.00, 0.00, -2.99164, 0.00",float4
cb_mUserClip,"0.00, 0.00, 0.00, 1.00",float4
cb_mEyePoint,"0.00, 0.00, 0.00",float3
cb_mFogMode,"2",int
cb_mFogStart,"0.00",float
cb_mFogEnd,"0.00",float
cb_mFogDensity,"1.14117E-009",float
cb_mFogEnable,"455810",int
cb_mFogColor,"0.6549, 0.78431, 0.94118, 1.00",float4
cb_mDisplayParams,"1529.00, 1890.00, 0.00131, 0.00106",float4
cb_EdgeTessellationFactors,"15.00, 64.00, 0.10, 15.00",float4
cb_mEyePbh,"0.01146, 0.00022, -2.92905",float3
cb_FarClip,"96560.64",float
cb_NearClip,"2.99164",float
cb_fPrecipitationLevel,"0.00",float
cb_QmicUV,"209130689, 177467752",int2
cb_Altitude,"29.50865",float
cb_SurfaceAlt,"0.00",float
cb_DetailTextureOrigin,"-1539.51, 2827.705",float2
cb_WaveDetailTextureOrigin,"1132.49, -2171.666",float2