Skip to content

Vanilla Render Modes

raffclar edited this page Jun 9, 2022 · 1 revision

Vanilla Render Modes

Black & White was developed using direct3d version 7. This API was fully fixed function and rendering was done by changing states on the hardware. See Getting frame captures of Vanilla Black and White for a guide on how to capture a frame for analysis.

Internally, a material is represented with the following data structure.

enum RENDER_MODE {
  RENDER_MODE_SMOOTH = 0x0,
  RENDER_MODE_SMOOTH_ALPHA = 0x1,
  RENDER_MODE_TEXTURED = 0x2,
  RENDER_MODE_TEXTURED_ALPHA = 0x3,
  RENDER_MODE_ALPHA_TEXTURED = 0x4,
  RENDER_MODE_ALPHA_TEXTURED_ALPHA = 0x5,
  RENDER_MODE_ALPHA_TEXTURED_ALPHA_NZ = 0x6,
  RENDER_MODE_SMOOTH_ALPHA_NZ = 0x7,
  RENDER_MODE_TEXTURED_ALPHA_NZ = 0x8,
  RENDER_MODE_TEXTURED_CHROMA = 0x9,
  RENDER_MODE_ALPHA_TEXTURED_ALPHA_ADDITIVE_CHROMA = 0xa,
  RENDER_MODE_ALPHA_TEXTURED_ALPHA_ADDITIVE_CHROMA_NZ = 0xb,
  RENDER_MODE_ALPHA_TEXTURED_ALPHA_ADDITIVE = 0xc,
  RENDER_MODE_ALPHA_TEXTURED_ALPHA_ADDITIVE_NZ = 0xd,
  RENDER_MODE_TEXTURED_CHROMA_ALPHA = 0xf,
  RENDER_MODE_TEXTURED_CHROMA_ALPHA_NZ = 0x10,
  RENDER_MODE_CHROMA_JUST_Z = 0x12,
};

struct LH3DColor {
  uint8_t b;
  uint8_t g;
  uint8_t r;
  uint8_t a;
};

struct LH3DMaterial {
  enum RENDER_MODE render_mode; // 4 bytes
  uint8_t alpha_ref;
  uint8_t cull_mode;
  struct LH3DTexture* texture;
  struct LH3DColor color;
};

Rendering Modes

Based on different rendering modes, the graphics engine will draw meshes with different shading configurations, what we would now call a fragment or pixel shader.

The configurations for the different modes are as follows:

Rendering Mode Alpha Blend Src Blend Dest Blend Alpha Test Z Write Alpha Ref Input Configuration
Smooth FALSE One One FALSE TRUE N/A 2
Smooth Alpha TRUE Src Alpha 1 - Src Alpha FALSE TRUE N/A N/A
Smooth Alpha (NZ) TRUE Src Alpha 1 - Src Alpha FALSE FALSE N/A N/A
Textured FALSE One One FALSE TRUE N/A 2
Textured Alpha TRUE Src Alpha 1 - Src Alpha FALSE TRUE N/A 4
Textured Alpha (NZ) TRUE Src Alpha 1 - Src Alpha FALSE FALSE N/A 4
Alpha Textured TRUE Src Alpha 1 - Src Alpha FALSE TRUE N/A 2
Alpha Textured Alpha TRUE Src Alpha 1 - Src Alpha FALSE TRUE N/A 4
Alpha Textured Alpha (NZ) TRUE Src Alpha 1 - Src Alpha FALSE FALSE N/A 4
Chroma Just Z TRUE Src Alpha One TRUE TRUE Material, Global Alpha 2
Textured Chroma TRUE Src Alpha 1 - Src Alpha TRUE TRUE Material, Global Alpha, Global Color 2
Textured Chroma Alpha TRUE Src Alpha 1 - Src Alpha TRUE TRUE Material, Global Alpha, Global Color 4
Textured Chroma Alpha (NZ) TRUE Src Alpha 1 - Src Alpha TRUE FALSE Material, Global Alpha 4
Alpha Textured Alpha Additive TRUE Src Alpha One FALSE TRUE N/A 4
Alpha Textured Alpha Additive (NZ) TRUE Src Alpha One FALSE FALSE N/A 4
Alpha Textured Alpha Additive Chroma TRUE Src Alpha One TRUE TRUE Material, Global Alpha 4
Alpha Textured Alpha Additive Chroma (NZ) TRUE Src Alpha One TRUE FALSE Material, Global Alpha 4

With the input configurations being:

Input Configuration Color Op Color 1 Color 2 Alpha Op Alpha 1 Alpha 2
2 Modulate Texture Diffuse Select Arg 1 Texture N/A
4 Modulate Texture Diffuse Modulate Texture Diffuse