首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用P3D实现纹理透明度

使用P3D实现纹理透明度
EN

Stack Overflow用户
提问于 2018-06-02 23:52:49
回答 1查看 193关注 0票数 0

我目前正在使用P3D编写一个“末日”克隆。我没有使用任何外部库。我有一个奇怪的神器,当我使用蒙版纹理时发生的。我已经尝试了几种方法来修复它,但都没有用:(。DISABLE_DEPTH_MASK抑制了工件,但是我的sprite排序完全错误。

如果有人能为我指明正确的方向,我将不胜感激!我就快有一个可以正常工作的引擎了!(忽略“末日”面孔和士兵精灵,当然,它们只是我使用…的临时资产)

artifact1

正如你所看到的,即使面具在工作(看士兵的脚),它也会留下一个巨大的黑色(背景色)人工制品。

artifact2

当走在四合院后面时,文物不是太差,但仍然存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 01:20:45

您必须使用/启用。如果你想渲染一个不完全不透明,但有部分或完全透明区域的精灵,可以使用这种技术。

在场景环境完成后,士兵在最后进行了渲染。必须启用深度测试。

在使用alpha通道渲染士兵精灵(纹理)之前启用混合。

代码语言:javascript
复制
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE_MINUS_SRC_ALPHA);

并在以下情况下禁用混合:

代码语言:javascript
复制
gl.glDisable(GL.GL_BLEND);

注意,士兵精灵的“黑色”背景必须有0.0的alpha通道(完全透明),士兵本身的alpha通道必须是1.0 (完全不透明)。通常情况下,PNG图像可以满足这一要求。

解释:

在渲染士兵时,背景已经绘制完毕,背景颜色(环境的颜色)已经存储在帧缓冲区中。

混合函数为:

代码语言:javascript
复制
dest.rgba = dest.rgba * (1 - src.a) + src.rgba * src.a

其中dest.rgba是帧缓冲区中的颜色,src.rgba是精灵的颜色。

如果精灵的alpha通道为1.0 (src.a = 1.0;不透明),则

代码语言:javascript
复制
dest.rgba = dest.rgba * (1.0 - 1.0) + src.rgba * 1.0

dest.rgba = src.rgba

如果精灵的alpha通道为0.0 (src.a = 0.0;透明),则

代码语言:javascript
复制
dest.rgba = dest.rgba * (1.0 - 0.0) + src.rgba * 0.0

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

https://stackoverflow.com/questions/50658626

复制
相关文章

相似问题

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