有沒有人將FreeType與DirectX 11集成進行字體渲染?我似乎找到的唯一文章是DirectX 11 Font Rendering。我似乎無法匹配正確的DXGI_FORMAT來呈現FreeType爲字形創建的灰度位圖。DirectX 11和FreeType
0
A
回答
2
有三種方式來處理在Direct3D 11灰階的紋理:
選項(1):您可以使用RGB格式和複製的通道。例如,您可以使用DXGI_R8G8B8A8_UNORM
並將R,G,B設置爲單個單色通道,將A設置爲全部不透明(0xFF)。您可以用同樣的方法處理Monochrome + Alpha(2通道)數據。
這種轉換通過加載庫DirectXTex亮度
.DDS
格式(D3DFMT_L8
,D3DFMT_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 Kit的MakeSpriteFont工具實現。由於每個像素使用1個字節,因此與使用DXGI_FORMAT_R8_UNORM
時的大小實際上是相同的。
該技術不適用於雙通道數據,但對alpha混合單色圖像(如字體字形)非常適用。
相關問題
- 1. DirectX下的FreeType文本渲染11
- 2. SlimDX和WPF(DirectX 11)
- 3. Directx 11 Compatiblilty
- 4. directX 11 scale texture2D
- 5. DirectX 11覆蓋
- 6. Directx 11球體
- 7. 在DirectX 11
- 8. Directx 11 2D ortho
- 9. Constant Buffer DirectX 11
- 10. Directx 11 Bitblt備選
- 11. DirectX 11上的NURBS?
- 12. Directx 11寄存器
- 13. WPF和SlimDX(DirectX 11)互操作
- 14. NV_STEREO_IMAGE_SIGNATURE和DirectX 10/11(nVidia 3D Vision)
- 15. 使用WPF和SlimDx(DirectX 10/11)
- 16. 的DirectX在Windows 7(11)和Windows 8(11.1)
- 17. DirectX 11訪問衝突
- 18. DirectX 11 Sprite 2D相機
- 19. Directx 11內存管理
- 20. DirectX 11功能級別
- 21. DirectX 11向後兼容
- 22. C++ DirectX 11 glGetUniformLocation等價於
- 23. DirectX 11 D3DXMatrixTranslation繼續運行?
- 24. C++ Directx 11環境照明
- 25. DirectX 11延期渲染
- 26. 澄清(的DirectX 10/11)
- 27. Directx 11紋理映射
- 28. Directx 11骨骼動畫
- 29. DirectX 11透明度問題
- 30. 降級DirectX 11至9.0c(Win7)
感謝您的詳細解釋查克!選項#2更符合我所需要的內容。我認爲DXGI_FORMAT_R8_UNORM是正確的格式,但不確定。我還需要稍微更新一下像素着色器,以正確調整RGB。 –