2015-10-14 120 views

回答

2

有三種方式來處理在Direct3D 11灰階的紋理:

選項(1):您可以使用RGB格式和複製的通道。例如,您可以使用DXGI_R8G8B8A8_UNORM並將R,G,B設置爲單個單色通道,將A設置爲全部不透明(0xFF)。您可以用同樣的方法處理Monochrome + Alpha(2通道)數據。

這種轉換通過加載庫DirectXTex亮度.DDS格式(D3DFMT_L8D3DFMT_L8A8),並與-xlum開關texconv命令行工具當支持。

這使紋理內存大4倍,但很容易集成使用標準着色器。

選項(2):您使用DXGI_FORMAT_R8_UNORM作爲格式將單色紋理保留爲單個通道。然後使用自定義着色器在運行時將紅色通道複製到RGB。

這其實是你鏈接的教程博客帖子是這樣做的:

///////// PIXEL SHADER 
float4 main(float2 uv : TEXCOORD0) : SV_Target0 
{ 
    return float4(Decal.Sample(Bilinear, uv).rrr, 1.f); 
} 

對於單色+阿爾法(2聲道),你會使用DXGI_FORMAT_R8G8_UNORM,然後你的自定義着色器將使用.rrrg爲調酒。

選項(3):可以單色數據壓縮到使用自定義編碼器DXGI_FORMAT_BC2格式。這是通過使用/TextureFormat:CompressedMono

// CompressBlock (16 pixels (4x4 block) stored as 16 bytes) 
long alphaBits = 0; 
int rgbBits = 0; 

int pixelCount = 0; 

for (int y = 0; y < 4; y++) 
{ 
    for (int x = 0; x < 4; x++) 
    { 
     long alpha; 
     int rgb; 

     // This is the single monochrome channel 
     int value = bitmapData[blockX + x, blockY + y]; 

     if (options.NoPremultiply) 
     { 
      // If we are not premultiplied, RGB is always white and we have 4 bit alpha. 
      alpha = value >> 4; 
      rgb = 0; 
     } 
     else 
     { 
      // For premultiplied encoding, quantize the source value to 2 bit precision. 
      if (value < 256/6) 
      { 
       alpha = 0; 
       rgb = 1; 
      } 
      else if (value < 256/2) 
      { 
       alpha = 5; 
       rgb = 3; 
      } 
      else if (value < 256 * 5/6) 
      { 
       alpha = 10; 
       rgb = 2; 
      } 
      else 
      { 
       alpha = 15; 
       rgb = 0; 
      } 
     } 

     // Add this pixel to the alpha and RGB bit masks. 
     alphaBits |= alpha << (pixelCount * 4); 
     rgbBits |= rgb << (pixelCount * 2); 

     pixelCount++; 
    } 
} 

// The resulting BC2 block is: 
// uint64_t = alphaBits 
// uint16_t = 0xFFFF 
// uint16_t = 0x0 
// uint32_t = rgbBits 

然後將所得紋理渲染時使用一個標準的α混合着色器在DirectX Tool KitMakeSpriteFont工具實現。由於每個像素使用1個字節,因此與使用DXGI_FORMAT_R8_UNORM時的大小實際上是相同的。

該技術不適用於雙通道數據,但對alpha混合單色圖像(如字體字形)非常適用。

+0

感謝您的詳細解釋查克!選項#2更符合我所需要的內容。我認爲DXGI_FORMAT_R8_UNORM是正確的格式,但不確定。我還需要稍微更新一下像素着色器,以正確調整RGB。 –