【问题标题】:Alpha channel being rendered black. How to make it transparent?Alpha 通道被渲染为黑色。如何让它透明?
【发布时间】:2014-07-19 08:28:30
【问题描述】:

我正在加载具有 32 位和一些透明区域的 png 纹理。我已经在我的初始化函数中设置了这段代码:

// OpenGL
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable( GL_ALPHA_TEST );
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glClearColor( 0.0, 0.0, 0.0, 0.0 );

这是我加载纹理的方式:

// Load textures
glGenTextures( 1, &this->texture );

int width, height;
unsigned char* image;

glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, this->texture );
std::string path = "../assets/textures/" + name;
image = SOIL_load_image( path.c_str(), &width, &height, 0, SOIL_LOAD_RGBA );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
SOIL_free_image_data( image );
glUniform1i( glGetUniformLocation( shader->shader, "materialTex" ), 0 );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

这是我得到的效果:

我正在尝试让草背景从黑色变为透明。

你能帮帮我吗?

【问题讨论】:

  • 我认为它可能比 OpenGL 更适合您的图像。你的图像背景是黑色的,还是没有填充?两种截然不同的东西
  • 您能否回读您的草纹理并确保 alpha 组件与您期望的 1.0 不同?
  • @SyntacticFructose 无填充。我已经用至少 3 种不同的 png 进行了测试,都是 32 位并且具有透明背景。
  • @agrum 我只是按照你的建议做了,黑色部分被读作“0 0 0 0”,而其他部分的 alpha > 0 变化很大。
  • @YuriA.Brito 先绘制红色背景,但禁用深度测试。这将阻止它写入深度缓冲区(当它们各自的测试也被禁用时,深度和模板写入被禁用)并导致您的问题。绘制后重新启用深度测试。在这种特殊情况下,深度测试使绘制顺序如此重要。

标签: c++ opengl rendering soil


【解决方案1】:

这里有几个问题,但都归结为 alpha 透明度取决于顺序这一事实。

不清楚你为什么首先使用深度缓冲区。该应用程序似乎是 2D 的,而且您似乎正在以相同的深度绘制每个 2D 图层。不过,您要绘制的红色背景需要先绘制。

如果您在启用深度测试的情况下绘制背景,它会将其深度值写入深度缓冲区,然后您尝试在其上绘制的其他精灵将失败,因为默认深度测试是GL_LESS(这会拒绝具有相同深度的对象的部分)。如果在绘制背景时禁用深度测试,也会禁用深度写入,这是解决问题的一种可能方法。

实际上,您可以完全消除深度测试并遵循 Alpha 混合的黄金法则:

  • 先绘制不透明的几何体,然后按深度对半透明对象进行排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2023-03-26
    • 2016-12-26
    相关资源
    最近更新 更多