首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX 11和FreeType

DirectX 11和FreeType
EN

Stack Overflow用户
提问于 2015-10-14 15:29:20
回答 1查看 2K关注 0票数 1

是否有人将FreeType与DirectX 11集成用于字体呈现?我找到的唯一一篇文章是DirectX 11字体渲染。我似乎无法匹配正确的DXGI_FORMAT来呈现FreeType为字形创建的灰度位图。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-14 17:35:23

在Direct3D 11中有三种处理灰度纹理的方法:

选项(1):您可以使用RGB格式并复制通道。例如,您可以使用DXGI_R8G8B8A8_UNORM并将R、G、B设置为单个单色通道,将A设置为所有不透明(0xFF)。你可以用同样的方式处理单色+阿尔法(2通道)数据。

.DDS亮度格式(D3DFMT_L8D3DFMT_L8A8)由DirectXTex库和织构命令行工具与-xlum开关一起加载时,支持这种转换。

这使得纹理高达4倍的内存,但很容易集成使用标准着色器。

选项(2):使用DXGI_FORMAT_R8_UNORM作为格式,将单色纹理保持为单一通道。然后使用自定义着色器呈现,它在运行时将红色通道复制到RGB。

实际上,您链接到的教程博客帖子就是这样做的:

代码语言:javascript
复制
///////// 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格式。这是在DirectX工具包MakeSpriteFont工具中使用/TextureFormat:CompressedMono实现的。

代码语言:javascript
复制
// 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

生成的纹理然后使用标准的α混合着色器呈现.因为它每像素使用一个字节,这实际上与您使用的DXGI_FORMAT_R8_UNORM大小相同。

这种技术不适用于2通道数据,但对α混合单色图像,如字体符号,效果很好。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33129524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档