Quantcast
Channel: Question and Answer » hlsl
Viewing all articles
Browse latest Browse all 69

HLSL screen-space to world-space

$
0
0

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;

RenderDoc screenshot showing the vertex shader stage

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

Viewing all articles
Browse latest Browse all 69

Trending Articles