gpt4 book ai didi

android - OpenGL : Create a "transparent window-like object"

转载 作者:行者123 更新时间:2023-11-29 21:10:41 25 4
gpt4 key购买 nike

我正在开发一个增强现实应用程序,它应该渲染一个 3D 模型。到目前为止,一切都很好。我将 Vuforia 用于 AR,将 libgdx 用于图形,一切都在 Android 上,工作起来很有魅力......

问题是,我需要创建一个“类似窗口”的效果。我真的需要让模型看起来像一扇 window ,你可以透过 window 看到它后面。这意味着我有某种墙壁对象,上面有一个洞(一扇 window )。通过这个洞,可以看到墙后的另一个3D模型。

Side View User View

问题是,我还需要渲染视频背景。而这个背景也是在墙后。我不能在渲染墙壁时只打开混合,因为那样会破坏视频图像。

所以我需要让墙和它后面的所有东西都透明,但不是视频背景。

仅使用 OpenGL 是否有可能实现这样的奇迹?

我一直在考虑前端到端和后端到前端渲染的某种组合:先渲染背景,然后渲染墙壁,但只将它混合到 alpha channel 中(使视频仅在像素上可见未被墙覆盖),然后渲染实际内容,但仅将其混合到可见像素(不在墙后面),然后再次“渲染”墙,但这一次使其后面的所有内容都可见。这样的东西行得通吗?

最佳答案

I can't just turn of blending when rendering the wall

是什么让你这么想的? OpenGL 不是场景图。这是一个绘图 API,一切都按照您的调用顺序发生。

所以操作顺序是

  1. 在关闭混合的情况下绘制视频背景。

  2. 视频和墙壁之间的对象(根据需要打开或关闭混合)

  3. 绘制墙壁,启用混合或 alpha 测试,以便您可以创建窗口。

Is such marvel even possible using only OpenGL?

理解 OpenGL 的关键在于,您不会想到用它来设置 3D 世界场景,而是用它来绘制 3D 世界的 2D 图片(因为 OpenGL 实际上就是这样做的)。最后,OpenGL 只是更智能的画笔,可以在平面 Canvas 上绘制。想一想您如何在纸上作画,如何遮盖不同的部分。然后使用 OpenGL 完成。

更新

好的,现在我明白你想要实现什么了。墙并不是真正可见的,而是一个依赖于深度的 mask 。很容易实现:使用 alpha 测试 而不是混合来在深度缓冲区中生成窗口。或者,您可以不进行 alpha 测试,而只绘制 4 个四边形,它们之间形成一个窗口。

诀窍在于,您只将其绘制到深度缓冲区中,而不是颜色缓冲区中。

glDepthMask(1);
glColorMask(0,0,0,0);
draw_wall();

在这种情况下混合将不起作用,因为即使是完全透明的 fragment 也会在深度缓冲区中结束。因此阿尔法测试。在固定函数 OpenGL glEnable(GL_ALPHA_TEST)glAlphaFunc(…) 中。但是,在 OpenGL-ES2 上,您必须通过着色器来实现它。

假设你有一个单 channel 纹理,在 fragment 着色器中做

float opacity = texture(sampler, uv).r;
if( opacity < threshold ) discard;

关于android - OpenGL : Create a "transparent window-like object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com