首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WebGL中带距离场的文本绘制问题

WebGL中带距离场的文本绘制问题
EN

Stack Overflow用户
提问于 2021-11-28 12:51:30
回答 2查看 107关注 0票数 0

我用Qt OpenGL 3.3制作了这个距离字段示例:

效果很好。我是用这个视频教程制作的:OpenGL 3D游戏教程33:远程字段文本呈现

我用WebGL逐行重写了这个示例,看起来很糟糕:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-28 12:58:50

这似乎是一个与预乘α相关的问题(参见为什么我的WebGLα透明度看上去不对? )。

您需要在片段着色器中将颜色通道乘以alpha通道:

代码语言:javascript
运行
复制
void main() {
    // [...]

    vec4 color = ...;

    gl_FragColor = vec4(color.rgb * color.a, color.a);
}

并将混合函数更改为1* source_color + (1 -alpha) * dest_color

代码语言:javascript
运行
复制
gl.enable(gl.BLEND);
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
票数 1
EN

Stack Overflow用户

发布于 2021-11-28 15:02:21

_Develop提出的另一个解决方案

代码语言:javascript
运行
复制
const options: WebGLContextAttributes = {
    alpha: false, premultipliedAlpha: false
}
gl = (canvas as HTMLCanvasElement).getContext("webgl", options);
代码语言:javascript
运行
复制
gl.enable(gl.BLEND);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
代码语言:javascript
运行
复制
precision mediump float;

varying vec2 vTexCoord;
uniform sampler2D uSampler;

const float width = 0.5;
const float edge = 0.1;

void main()
{
    float distance = 1.0 - texture2D(uSampler, vTexCoord).a;
    float alpha = 1.0 - smoothstep(width, width + edge, distance);
    if (alpha < 0.001)
    {
        discard;
    }
    gl_FragColor = vec4(0.2, 0.5, 0.0, alpha);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70143577

复制
相关文章

相似问题

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