【问题标题】:accesing to RGB and depth buffer of fragment shader : GLSL访问片段着色器的 RGB 和深度缓冲区:GLSL
【发布时间】:2017-02-03 06:23:50
【问题描述】:

继续这个问题:

GLSL : accessing framebuffer to get RGB and change it

是否可以基于GLSL开发如下程序?

  1. 绘制对象1
  2. 使用着色器获取深度缓冲区(同时保存 rgb)
  3. 同时绘制对象 1、对象 2
  4. 获取深度
  5. 检查深度是否不同(深度 2 与深度 4)
  6. 绘制对象 1 : 对于深度不变的范围 -> 绘制为原始 RGB : 对于深度变化的范围 -> 用不同的 RGB 绘制

我确认了这个区分对象 1 的算法被其他使用 glut 函数的对象隐藏了。 我使用了 glReadbuffer、glDrawbuffer 函数。但是那些太慢了,我想使用 GLSL。

【问题讨论】:

  • 这看起来像an XY problem。如果您只想找出一个对象是否被隐藏,并在这种情况下绘制不同的东西,那么您不需要专门的着色​​器或大量的深度缓冲区来做到这一点。

标签: opengl glsl


【解决方案1】:

如果唯一的目标是在 object1 隐藏在 object2 后面时使用不同的颜色集渲染它(这是 object1 深度发生变化的像素),我会采用完全不同的方法。

  1. 仅使用深度写入绘制 object2(glDrawBuffer(GL_NONE)glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
  2. 绘制 object1,深度测试设置为 glDepthFunc(GL_GREATER),当 object1 在 object2 后面时,你想要的颜色
  3. 绘制 object1 并将深度测试设置为 glDepthFunc(GL_LESS) 并在 object1 位于 object2 前面时使用您想要的颜色。

与您在问题中描述的算法相比,不需要任何回读操作或额外的帧缓冲区

【讨论】:

  • 天啊...你是天才!?我认为你给出的算法是正确的,而且速度更快。但是,当我编写代码时,它似乎有一些缺失点。你可以帮帮我吗?我又问了一个问题:stackoverflow.com/questions/42059541/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
相关资源
最近更新 更多