问题标签 [depth-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2286 浏览

opengl - 从片段着色器访问 32 位深度缓冲区?

我正在尝试使用以下阴影技术,我在 NVIDIA 网站上阅读了它,这似乎是一种很好的技术。我更喜欢它来计算 cpu 上的阴影体积,因为它看起来更“真实”,我可以使用它来进行软阴影。:

第一关:

  • 从 LIGHT0 的角度填充深度缓冲区。复制此深度缓冲区以进行第二次传递。(*)

第二关:

  • 从 EYE 渲染视图,并为每个片段:
    • 获取存储在 (*) 中的深度缓冲区中的 XY 位置。获取对应的 32 位值。
    • 计算到灯光的距离。
    • 将此距离与存储的深度缓冲区值匹配。
    • 如果它更大,则在 glDisable(LIGHT0) 模式下绘制片段,否则在启用灯光的情况下绘制。为此,我使用了两个片段着色器,并根据距离的比较在两者之间进行片段混合/切换。

现在,出于某些原因,我想在片段着色器中执行最后一步。其中之一是我想将距离考虑到阴影的“效果”。在我的游戏中,如果与障碍物的距离很小,可以肯定地说阴影会非常“严格” . 如果距离越远,全局光照越多,阴影越小。这是因为它是纸牌游戏,对于更复杂的“凹”形状则不会出现这种情况。

但是,我是 openGL 的新手,我不明白如何执行以下任何操作:

  • 如何在不将其复制到 2d 纹理的情况下访问片段着色器中的第一遍深度缓冲区。我认为这是不可能的?
  • 如果将 32 位深度缓冲区复制到每个 R、G、B、A 组件中具有 8 位的纹理,然后在片段着色器中重新组装该值是我能做的最有效的事情?
  • 如果有跨平台扩展,我可以使用它。

谢谢,如果有人可以帮助我或给我更多的想法,我现在有点难过,我缺乏良好的硬件和空闲时间真的使得调试/尝试所有东西的过程很累。

0 投票
2 回答
24681 浏览

android - Android OpenGL ES Framebuffer 对象 - 将深度缓冲区渲染到纹理

我正在使用运行支持 OpenGL ES 1.1 和 OpenGL ES 2.0 的 Froyo 的 Android 设备

我想将深度缓冲区渲染为纹理。看过许多其他平台(包括 iPhone)上的 OpenGL、OpenGL ES 示例后,我尝试了许多 FBO 配置。

我似乎能够获得带有颜色纹理的 FBO 设置,但每次我附加深度纹理时它都会失败。

我当前的代码基于此示例,但也创建了颜色纹理,而不是将绘制和读取缓冲区设置为无。

是否有在 Android 上配置 OpenGL ES FBO 以将深度渲染到纹理的简单示例?或者是否有描述支持和不支持的文档?


感谢您的评论 - 我特别需要 ES 1.1 的解决方案,如果它可以在 Android 上找到并运行。我还想看看 ES 2 - 我不确定我是否理解将深度信息打包到颜色缓冲区中的想法 - 你有没有参考资料可以让我更好地理解这个想法?

关于代码 - 我的来源与我上面发布的链接几乎没有不同。Framebuffer 状态为未完成。


感谢片段着色器的建议——我现在明白了。如果我无法获得另一个解决方案,我会看看。我的理想是同时获得深度和颜色——如果我能提供帮助,我真的不想单独渲染颜色和深度。

0 投票
1 回答
6998 浏览

iphone - 在opengl es 2.0 iphone中使用深度缓冲区

我遵循了在 opengl es 1.1 中使用深度缓冲区的教程。但我使用opengl es 2.0。实现的代码导致错误:Failed to make complete framebuffer object 8cd6. 请参阅下面的实现代码:

问候尼古拉斯

0 投票
1 回答
3103 浏览

opengl - OpenGL:我可以从深度缓冲区中屏蔽完全透明的片段吗?

有没有办法告诉OpenGL不要将完全透明片段的深度写入深度缓冲区?

请确保,我要渲染的纹理绝不是半透明的;它的 alpha 值只有 1.0 或 0.0,并且我使用 GL_NEAREST 过滤器,因此它永远不会插入到两者之间的任何值。

我认为当片段的 alpha 值为 0.0 时,OpenGL 能够简单地不写入深度缓冲区是合理的(这样我可以以任何顺序渲染具有此类纹理的图元),但我无法找到让 OpenGL 做到这一点的方法。有谁知道这是否可能,在这种情况下,它是如何完成的?

0 投票
4 回答
4778 浏览

opengl - 深度测试默认在 OpenGL 中反转,还是我弄错了?

我一直在玩 OpenGL 整整一周或同等时间。在 2D 之后,我现在正在尝试 3D。我想重现您在http://johnnylee.net/projects/wii/上的第三个视频中看到的 3D 场景。
我很难让纹理和深度的一切都正常工作。

我最近遇到了 2 个在视觉上具有相同影响的问题:

  • 一种使用我为 2D 找到的技术在 3D 中无法很好融合的纹理。
  • 一个对象出现在顶部上方的底部。就像这里暴露的问题:OpenGL中的深度缓冲区

我已经解决了这两个问题,但我想知道我是否做对了,尤其是第二点


对于第一个,我想我明白了。我有一个圆形目标的图像,圆盘外的任何东西都带有 alpha。它在 OpenGL 中加载得很好。它后面的一些(由于我的 z 排序问题)其他目标被我用来绘制它的自然正方形四边形的透明区域所隐藏。

这样做的原因是纹理的每个部分都被假定为对于深度缓冲区是完全不透明的。使用glEnable(GL_ALPHA_TEST)with 测试glAlphaFunc(GL_GREATER, 0.5f)使纹理的 alpha 层充当每像素(布尔)不透明度指示器,从而使混合变得非常无用(因为我的图像具有布尔透明度)。

补充问题:顺便说一句,是否有一种方法可以为 alpha 测试指定不同的来源而不是用于混合的 alpha 层?


其次,我找到了解决问题的方法。在清除颜色和深度缓冲区之前,我已将默认深度设置为 0 glClearDepth(0.0f),并且我使用了“更大”深度函数glDepthFunc(GL_GREATER)

对我来说看起来很奇怪的是深度是 1.0,深度函数GL_LESS默认是“少”。我基本上是在反转它,这样我的对象就不会被反转显示......

我在任何地方都没有看到过这样的黑客,但另一方面,我没有看到任何地方以错误的顺序系统地绘制对象,无论我绘制它们的顺序是什么!


好的,这是现在可以按我想要的方式工作的代码(精简,我希望不是太多):

0 投票
2 回答
2667 浏览

iphone - (iOS) OpenGL ES (2.0) 应用程序,如何在 Z 中移动对象?

我正在使用 XCode 中的 OpenGL ES (2.0) Application (iOS) 源代码,并试图使彩色正方形在 Z 坐标中移动,所以我尝试将着色器代码从

gl_Position.y += sin(翻译) / 2.0;

gl_Position.z += sin(翻译) / 2.0; 没有成功。

广场根本不动。它在 X 和 Y 中移动良好认为......在初始化 OpenGL 时我需要激活一些选项吗?谢谢!

更新: 我上传了一个例子。这大致是 XCode 生成的 OpenGL ES 模板,我只是在 Shader.vsh 中添加了创建深度缓冲区的调用,以及 gl_Position.z += sin(translate) / 2.0f 的 gl_Position.x。

我希望看到正方形在 Z 坐标上以正弦形式移动,但它不会。它要么保持静止,要么如果我乘以 sin(),它会在一个循环中出现和消失。

如果有人可以帮助我,我将不胜感激,因为真诚地我不知道还能做什么,相信我我尝试了很多......

源代码位于:http ://cl.ly/24240x2D1t2A3I0c1l1P

谢谢!

0 投票
3 回答
2239 浏览

java - JOGL 深度缓冲不起作用

我已经使用 JOGL 几天了,现在这已成为主要障碍。我无法让形状以正确的 z 顺序绘制,而是按照它们提供给 OpenGL 的顺序绘制。

在过去的几个小时里,我一直在研究这个问题,一般的解决方案(和我的反应)似乎如下:

  • 确保您的截锥体是正确的

    • 我已经仔细检查了截锥体,它似乎是正确的
    • 我已经切换到 gluLookAt 而不是定制的截锥体
    • 我已经切换到 glOrthof 只是为了确保问题不是透视。
    • 我什至根本没有设置任何视图,而是在似乎是默认值的 -1、1 范围内工作
  • 确保以下调用在 init 中:

    • gl.glEnable(GL.GL_DEPTH_TEST);
    • gl.glDepthFunc(GL.GL_LEQUAL);
  • 确保在每次重绘时清除深度缓冲区

    • gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

我在下面提供了发生此问题的程序的非常基本的示例。如果你有 JOGL 并运行它,你会看到 Z 位置 -0.5f 的红色三角形总是在顶部,而三角形彼此围绕旋转。如果交换两个三角形顶点调用,则绿色三角形将始终位于顶部。

这对我来说是一个巨大的头痛,所以任何见解都会有所帮助,无论是来自 JOGL 还是一般的 OpenGL,但我似乎看不出有什么问题。

另请注意,为简洁起见,我删除了正确的代码来破坏窗口。

0 投票
1 回答
758 浏览

java - 在 Java 3D 场景中绘制清晰的健康条

因此,我正在开发 Java 3D 游戏,并且正在实现悬停在单位上方的健康栏。

我首先在单元位置上方的 3D 点绘制一个四边形,并应用广告牌行为使其始终面向相机。

但我遇到的问题是健康栏有时会被其他风景遮住。

所以我正在考虑以下选项:

  1. 覆盖健康栏像素的 Z / 深度缓冲区值,以使渲染器认为它们比之后渲染的任何东西更靠近相机。

    我试过了renderingAttributes.setDepthTestFunction(RenderingAttributes.ALWAYS)。虽然它使渲染器在之前在同一区域中绘制的任何东西上绘制健康条,但当稍后在健康条顶部绘制其他风景时,它并没有帮助。

    在 Java 3D 中有没有更好的方法来做到这一点?

  2. 将生命值条的 3D 位置投影到摄像机前面的 2D 平面上。听起来可行,但在我着手重新发明所需的所有数学之前,也许有人可以指出一个现有的解决方案。

  3. 从 Java 3D 切换到 LWJGL 或 jMonkeyEngine 之类的东西(不仅针对此问题,还针对 Java 3D 已死的一般抱怨等)。虽然我什至不确定它们是否更灵活地解决这个特定问题。根据我的阅读,游戏开发中最严重的错误之一是在开发中期切换引擎。

0 投票
2 回答
10567 浏览

opengl - glReadPixels GL_DEPTH_COMPONENT 和颜色

如何从任何 OpenGL 绘图中获取深度和颜色信息?我想将深度图像和彩色图像保存到磁盘。我尝试的是以下内容:

但看起来只有深度数组被填充了?

0 投票
2 回答
5146 浏览

iphone - 使用深度渲染缓冲区有什么问题?OpenGL ES 2.0

我使用这段代码:

但是当我运行应用程序时,我看到紫屏?这段代码有什么问题?