opengl - 访问片段着色器的RGB和深度缓冲区: GLSL

标签 opengl glsl

继续这个问题:

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进行绘制

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

最佳答案

如果唯一的目标是在对象 1 隐藏在对象 2 后面(对象 1 的深度已更改的像素)后面时使用不同的颜色集渲染对象 1,我会采用完全不同的方法。

  1. 仅使用深度写入绘制对象2(glDrawBuffer(GL_NONE)glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE))
  2. 绘制对象 1,并将深度测试设置为 glDepthFunc(GL_GREATER) 以及当对象 1 位于对象 2 后面时所需的颜色
  3. 绘制对象 1,深度测试设置为 glDepthFunc(GL_LESS),并在对象 1 位于对象 2 前面时设置所需的颜色。

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

关于opengl - 访问片段着色器的RGB和深度缓冲区: GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018019/

相关文章:

c++ - OpenGl/Glew/GLSL 中的 Vec3 未定义

c# - 使用带有 C# 的 OpenGL 截取游戏的屏幕截图

c++ - 计算顶点法线OpenGL

c - 如何对纹理执行 HSL 变换?

java - GLSL 几何着色器的性能出乎意料地慢

c++ - GLM 可以用作 glUniformx() 中的普通旧数据吗?

opengl - 通过统一属性将 float3/vec3 传递给着色器

c++ - opengl 读取.3ds 文件?

c++ - 面向简单的基于着色器的 GL 程序的 OO 架构

opengl - openGL中的渲染金字塔