【问题标题】:Is there an OpenGL function to reset a texture to a solid color?是否有将纹理重置为纯色的 OpenGL 函数?
【发布时间】:2014-01-19 10:42:24
【问题描述】:

有没有办法用纯色初始化或重置 OpenGL 纹理?因为我想支持笔记本的 Intel HD Graphics 4000,所以我可以使用最高 OpenGL 4.0 的功能。

【问题讨论】:

  • @fedab 我创建了一个非常灵活的渲染管道。渲染通道可以动态切换或修改。因此,每个渲染通道都可以指定在通道被禁用时执行的回退,以便整个管道仍然有效。这些回退包括用纯色填充纹理并在不修改的情况下复制另一个纹理。

标签: opengl colors textures opengl-4


【解决方案1】:

如果您从它的单元/采样器对象中取消绑定纹理,它的纹理访问将全部显示为白色。所以我建议你简单地添加一个统一的颜色调制。如果您需要纯色,请取消绑定纹理并将该颜色统一设置为您想要的任何颜色。

但坦率地说,在我看来,就像您想重新实现 OpenGL 固定功能管道一样,您需要使用大量开关来获得所需的效果。我们终于摆脱了它,现在你想重生这个祸根吗?

【讨论】:

  • 我觉得我的渲染管线设计得很好。但是,我很想听听您对此的看法。渲染通道是在脚本文件中定义的,并且可以在运行时根据发生的回退进行切换。这是我的current pipeline script。制服也可以从脚本中设置。您是否看到我可以改进的管道中的设计错误?
  • 固定功能管道的问题是许多用例不适合它。但是如果提问者的程序的需求与固定功能管道的能力完全匹配呢?
【解决方案2】:

虽然你说你最多可以使用 GL 4.0(并且你得到了一些答案),但我仍然想指出,从 GL 4.4 开始,还有glClearTexImage()

与此相关的 OpenGL 扩展是 ARB_clear_texture。据说 Intel HD 4000 支持 GL4.0,但随着更新的驱动程序,许多扩展实现了 4.1、4.2 和 4.3 级别功能的扩展。但是,我还没有找到任何声称英特尔已开始实施 4.4 级功能的消息来源。我发现的最新消息来源是OpenGL feature matrix from february 2014,表明 Intel des 尚不支持该功能。但我发现未来的驱动程序版本很可能会支持此扩展。

【讨论】:

  • 您不知道英特尔的高清显卡驱动程序是否支持此扩展,是吗?
  • 感谢您的回答和有用的资源。
【解决方案3】:

也许您可以使用帧缓冲区。您可以将其与纹理链接并在帧缓冲区上绘制您想要的内容。如果后备在起作用,则将帧缓冲区清除为所需的颜色。

然后将帧缓冲区绘制为纹理。

【讨论】:

  • 在过去的几个小时里,我使用简单的着色器以相同的方式实现了清除和复制。现在可以了。你认为清除比使用简单的片段着色器快很多吗?
  • @danijar 不确定。您必须创建并运行着色器。我会使用OpenGL Wiki 中描述的清算。
【解决方案4】:

您可以通过使用glTexSubImage2D 将您的颜色数据复制到已创建的纹理中,并为其提供完整的纹理尺寸来做到这一点。不同的是,这不会创建一个新的缓冲区,而只是更新它。

【讨论】:

  • 所以我会为每个像素创建一个相同颜色的长数组并将其发送到视频卡,对吧?
  • @danijar 是的,就像一个普通的图像。是什么使得这是一个要求,问题是为了清除缓冲区(例如帧缓冲区),您需要锁定缓冲区并循环通过它并重置每个像素。此操作很慢,这就是它在硬件中实现的原因。在你的情况下,你没有那个特权。除非您可以使用着色器动态修改纹理对象。检查纹理缓冲区对象,但不确定。
  • @danijar 您可以使用 FBO 做到这一点,这样您可以减少到 GPU 的数据传输。但这需要更多的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多