【问题标题】:glReadPixels and alpha channels returning 1.0glReadPixels 和 alpha 通道返回 1.0
【发布时间】:2011-01-18 12:13:59
【问题描述】:

我正在从帧缓冲区读取像素数据,似乎一切正常,除了 alpha 值始终为 1.0

  GLfloat lebuf[areasize * 4];
  glReadPixels(xstart, ystart, partw, parth, GL_RGBA, GL_FLOAT, lebuf);

我已将窗口创建代码设置为支持 Alpha 通道:

  SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8);

还有其他地方我应该检查一下为什么 alpha 通道似乎一直是 1.0 吗?更好的是,是否有其他方法(除了 glReadPixels)从帧缓冲区将纹理放入客户端内存?

编辑:这就是我清除缓冲区的方式:

 glClearColor(0,0,0,0);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

【问题讨论】:

  • 您是否尝试使用另一种格式(如 GL_UNSIGNED_BYTE)而不是 GL_FLOAT 来 glReadPixels ?以防万一这是驱动程序错误?
  • 您是否尝试删除所有渲染并仅保留 glClear 和 glReadPixels ?在这种情况下,行为是否相同?
  • 是的,我删除了图纸,只尝试了 glCLear 的东西,它仍然是黑色的,不透明的图片。我会尽快尝试使用 GL_UNSIGNED_BYTE
  • 哦哇..启用 GL_UNSIGNED_BYTE 有效..它没有透明背景!令人费解!
  • 你检查过 OpenGL 错误吗,顺便说一句?

标签: opengl sdl


【解决方案1】:

你能检查一下吗:

  • 您的 SDL 已接受您的格式 (glGetIntegerv(GL_ALPHA_BITS, bits))?
  • 您的透明颜色不是 1 (glClearColor)。如果您清除到 0.5 并在渲染之前检索缓冲区会怎样。你检索到 0.5 吗?
  • 您的 alpha 缓冲区未写锁定 (glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE))?
  • 您是否在每帧结束时正确清除了 alpha 缓冲区?
  • 您的混合函数是否会将正确的 alpha 值写入缓冲区?

【讨论】:

  • 用 gDEBugger 检查后,GL_COLOR_CLEAR_VALUE 为 0,0,0,0,GL_ALPHA_BITS 为 8,GL_COLOR_WRITEMASK 为 n/a,但我做了 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)..
  • 尝试使用glClearColor(0,0,0,0.5) 清除并检查是否从帧缓冲区中检索到 0.5。
  • GL_BLEND_DST_ALPHA 虽然为零,但 GL_BLEND_DST_RGB 和 GL_BLEND_DST 也是如此
【解决方案2】:

如果您使用 GLUT,请记住您必须按如下方式设置主窗口:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL);

否则 glReadPixels 将始终读取 alpha 通道 = 1。

【讨论】:

    【解决方案3】:

    请使用以下行..问题将解决。

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL);
    

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      相关资源
      最近更新 更多