opengl - 从一个纹理读取并写入同一帧缓冲区中的单独纹理

标签 opengl

我有一个附加了 2 个纹理的帧缓冲区,是否可以在同一个片段着色器函数中从纹理 A 读取并写入纹理 B?

谢谢。

最佳答案

这比我预想的要棘手。我认为只要不采样并渲染到相同的纹理就可以了,无论纹理是否附加到 FBO。但是,当试图找到一些结论性的规范报价来支持这一点时,事情变得不太清楚。

4.5 规范确实包含一个短语,似乎证实了我最初的直觉(强调):

Specifically, the values of rendered fragments are undefined if any shader stage fetches texels and the same texels are written via fragment shader outputs, even if the reads and writes are not in the same draw call

有趣的是,“通过片段着色器输出写入”不会出现在 4.4 及之前的规范版本中。我不知道在 4.5 中添加这一点是否只是为了澄清,或者反馈循环的规则是否在 4.5 中放宽了。我在变更日志中找不到任何可以提供有关变更的更多背景信息的内容。

到 4.4 为止,规范表示如果纹理附加到当前绘制帧缓冲区并进行采样,则您将拥有一个反馈循环。由于没有其他说明,这将包括纹理附加到 FBO 但不用作绘制缓冲区的情况。

如果只要您不渲染到同一纹理并从同一纹理采样,大多数情况都可以正常工作,我不会感到惊讶。但为了完全安全,特别是如果您不依赖 OpenGL 4.5,您应该从 FBO 取消附加采样纹理。不将其包含在绘制缓冲区列表中是不够的。

关于opengl - 从一个纹理读取并写入同一帧缓冲区中的单独纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33025827/

相关文章:

c++ - 纹理值被限制在 0-1 范围内?

c - glOrtho(-1, 1, -1, 1, -1, 1) 完成了什么?

c++ - 如何在不使用 DirectX 或 OpenGL 的情况下渲染游戏?

java - 圆柱算法的奇怪之处

opengl - 除了游戏/电影/图片之外,计算机图形还有实际用途吗?

c# - 使用 OpenGL 时,C++ 比 C# 有哪些优势

c - opengl中处理光照和阴影的问题

c++ - 如何在 OpenGL 3.3 中实现 3d 纹理

c++ - OpenGL 不绘制三角形

c++ - 如何使用 glut 和 openGL 改变颜色?