【问题标题】:Font rendering with DirectX HLSL使用 DirectX HLSL 呈现字体
【发布时间】:2022-12-11 08:17:09
【问题描述】:

我有使用 FreeType 库生成的 Direct3D 单色字体纹理,我可以很好地渲染它们,但我现在正在尝试为它们着色。

由于我没有 HLSL 经验,所以我首先尝试使用固定函数尝试这样做,但似乎 Direct3D 现在已经删除了所有这些东西。

我尝试使用以下代码作为测试,但发现它用测试颜色填充了整个纹理,所以我得到了一个填充的矩形而不是字体。

在 DirectX 文档中找不到太多内容,这怎么办?

const char* g_strTTFPixelShaderProgram = 
"float4 main(float2 uv : TEXCOORD) : COLOR"
"{"
"    float4 originalColor; "
"    originalColor = tex2D( InputTexture , uv.xy); "
"    if(originalColor.r<TargetColor.r + Tolerance && originalColor.r>TargetColor.r - Tolerance"
"      &&originalColor.g<TargetColor.g + Tolerance&&originalColor.g>TargetColor.g - Tolerance"
"      &&originalColor.b<TargetColor.b + Tolerance&&originalColor.b>TargetColor.b - Tolerance)"
"    {"
"       float4 ARGB;     "                        
"       ARGB.a = 1.0;    "                       
"       ARGB.r = 0;      "                      
"       ARGB.g = 128;    "                     
"       ARGB.b = 0;      "      
"              originalColor.rgb = ARGB;"
"    }"
"    return float4(originalColor.rgb, originalColor.a); "
"}"
;

【问题讨论】:

标签: c++ directx hlsl direct3d freetype


【解决方案1】:

如果你有一个单色字体纹理(假设字形是白色的 - 所有通道中的字形,背景的透明黑色 - 所有通道中的零),你需要将从该纹理中获取的纹素乘以所需的颜色。

`const char* g_strTTFPixelShaderProgram = 
"float4 main(float2 uv : TEXCOORD) : COLOR"
"{"
"    float4 originalColor = tex2D( InputTexture , uv.xy);"
"    float3 tintColor = float3(0.0, 1.0, 0.0);"
"    return float4(originalColor.rgb * tintColor, originalColor.a);"
"}"
;`

【讨论】:

    最近更新 更多