Talk:M2/Rendering

From wowdev
Jump to navigation Jump to search

D3D11_BLEND

typedef enum D3D11_BLEND { 
  D3D11_BLEND_ZERO              = 1,
  D3D11_BLEND_ONE               = 2,
  D3D11_BLEND_SRC_COLOR         = 3,
  D3D11_BLEND_INV_SRC_COLOR     = 4,
  D3D11_BLEND_SRC_ALPHA         = 5,
  D3D11_BLEND_INV_SRC_ALPHA     = 6,
  D3D11_BLEND_DEST_ALPHA        = 7,
  D3D11_BLEND_INV_DEST_ALPHA    = 8,
  D3D11_BLEND_DEST_COLOR        = 9,
  D3D11_BLEND_INV_DEST_COLOR    = 10,
  D3D11_BLEND_SRC_ALPHA_SAT     = 11,
  D3D11_BLEND_BLEND_FACTOR      = 14,
  D3D11_BLEND_INV_BLEND_FACTOR  = 15,
  D3D11_BLEND_SRC1_COLOR        = 16,
  D3D11_BLEND_INV_SRC1_COLOR    = 17,
  D3D11_BLEND_SRC1_ALPHA        = 18,
  D3D11_BLEND_INV_SRC1_ALPHA    = 19
} D3D11_BLEND;


3.3.5a Shader Buffer Layouts

Vertex

  • c10: vec4(diffuse.rgb, padding)
  • c11: vec4(ambient.rgb, padding)
  • c12: vec4(lightDir.xyz, padding) (lightDir is transformed by view matrix before upload to GPU)
  • c28: vec4(?, ?, ?, alpha) (alpha is M2Element->alpha)
  • c29: vec4(animColor.rgb, ?) (animColor is the value from the animated color track for batch)


Draw Type

Not sure what to call these... layers? modes? passes?

  • 0: CM2SceneRender::DrawBatchProj
  • 1: CM2SceneRender::DrawPrepassBatch || CM2SceneRender::DrawBatch
  • 2: CM2SceneRender::DrawBatchDoodad
  • 3: CM2SceneRender::DrawRibbon
  • 4: CM2SceneRender::DrawParticle
  • 5: CM2SceneRender::DrawCallback

Shader Permute Selection

MoP

boneInfluences = element->skinSection->boneInfluences;

// 3-bit int stored in bits 29-31 (possibly draw type, see above)
drawMode = (element->renderInfo & 0xE0000000) >> 29;

if ( drawMode == DRAW_BATCH_DOODAD ) {

  if ( boneInfluences >= 1 ) {

    if ( boneInfluences <= 2u ) {

      v34 = boneInfluences;

    } else {

      v34 = 2;

    }

    v44 = 4 * v34;

  } else {

    v44 = 4;

  }

} else {

  if ( boneInfluences <= 2u ) {

    v11 = boneInfluences;

  } else {

    v11 = 2;

  }

  v44 = 4 * v11;

}


// Can be disabled by s_shadedList[blendingMode] == 0, or by M2Material.flags & 0x01
if ( lightingDisabled ) {

  v17 = 0;

} else if ( localLightCount <= 2 ) {

  v17 = 1 + localLightCount;

} else {
  
  v17 = 1 + 2;

}

if ( !(model->m_currentLighting->m_flags & 0x10) || material.flags & 0x100 || material.flags & 0x1 ) {

  v45 = 0;

} else if ( !scene->dword284 ) {

  v45 = 0;

} else {

  v45 = 192;

}

// v45: maybe 'use shadows' offset
// v16: use instancing
        0: instancing disabled
        1: instancing enabled
// v44: bone permute offset (see above)
// v17: light count
//      0: no lighting
//      1: global lighting only
//      2 - 3: global lighting with 1 - 2 point lights
element->m_vertexShaderPermuteIdx =
    v45
  + v16
  + 4 * (((v15 >> 1) & 1) + 4 * (v44 + v17));

// v20: possibly 'use ssao' (1)
// v21: lighting enabled (1)
// v38: custom type (seems to only check for type 4)
element->m_pixelShaderPermuteIdx =
    v14
  + 4 * (CShaderEffect::s_usePcfFiltering + 2 * (v43 + 2 * (v21 + 2 * (a4 + 2 * (v20 + 2 * (v38 == 4))))));

Liquid