【问题标题】:glClearColor(0, 0, 0, 0) is transparent, not blackglClearColor(0, 0, 0, 0) 是透明的,不是黑色的
【发布时间】:2012-08-29 10:01:35
【问题描述】:

我第一次尝试使用 OpenGL。我在网上查看了一些代码,然后尝试编写自己的代码,但我总是得到一个空(透明)窗口。 (我用GLUT打开窗口)。

我以为我做错了什么,所以我将代码从here 复制到我的C 源代码中,我的窗口仍然是透明的。此外,glClearColor()alpha 参数似乎没有任何效果。相反,alpha 值 似乎redgreenblue 参数确定。

glClearColor(0, 0, 0, 0)
glClearColor(0, 0, 0, 1)

glClearColor(1, 0, 0, 0)
glClearColor(1, 0, 0, 1)

glClearColor(1, 1, 0, 0)
glClearColor(1, 1, 0, 1)

glClearColor(1, 0, 0, 0)
glClearColor(1, 0, 0, 1)

alpha 参数不会改变结果。

我使用 Ubuntu 12.04 LTS,libgl1-mesa-dev

这是一个错误还是我做错了什么?

【问题讨论】:

  • 关于您的问题标题的注释: (0, 0, 0, 0) 应该是透明的,不是吗?您的问题可能是“(0, 0, 0, 1) 是透明的,而不是黑色的。”
  • @aib 实际上不确定。第四个参数称为alpha。我猜它是opacity = 1 - alpha,但我无法测试它,因为它没有任何效果。 :) 此外,在链接到上面链接代码的教程中,它会导致黑色背景。
  • @NiklasR:通常情况下不透明度 == alpha。

标签: c linux opengl ubuntu freeglut


【解决方案1】:

默认情况下,GLUT 不请求 alpha 缓冲区,我怀疑您看到的可能是窗口透明度的故障安全、临时实现。尝试添加:

glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA);

在其他 GLUT 初始化调用附近。请记住this function,因为如果/当您需要深度或模板缓冲区或双缓冲时,您需要再次修改调用。

【讨论】:

  • 谢谢,已经有效果了。例如,glClearColor(1, 1, 0, 1) 现在是完全不透明的,但 glClearColor(1, 1, 0, 0) 不是,就像上图一样。 alpha=0.0时不应该是绝对透明的吗?
  • 是的,任何(r, g, b, 0) 都应该是完全透明的。您是否尝试过其他值,例如 0.8 和 .2 的 alpha 值?我怀疑他们会四舍五入,但看看会发生什么仍然很有趣。另外,您确定您的显示模式、窗口管理器或任何后端支持 alpha 吗?
  • 好吧,因为(1, 1, 0, 0) 有点透明,(1, 1, 0, 1) 是完全不透明的黄色,将 alpha 设置为 [0;1] 中的值似乎是在它们之间进行插值。是的,我可以让 ma Terminal 透明或半透明。我使用 LTS 12.04 附带的默认窗口管理器(使用 Unity UI)。
  • 所以(0, 0, 0, a) 有效,并且您有一个可以调整其透明度(但不能调整背景颜色)的窗口?顺便问一下,你图片背景中的那些大矩形是什么? (右下角碰到“and”的“a”的那些。)
  • 嗯,我承认这些图片比我最初想象的更令人困惑。它是背景中的终端窗口,最初具有紫罗兰色背景色。嗯,不,它不能很好地工作,因为a=0 不是完全透明的。 :) 好吧,没有透明度我很好,但我想知道为什么 (1, 1, 0, 0) 看起来像 (1, 1, 0, 0.66)。或者这只是设计使然?
【解决方案2】:

在显示模式下使用 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB)

【讨论】:

  • 请解释你的答案,让读者清楚你的观点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
相关资源
最近更新 更多