gpt4 book ai didi

opengl - 多次渲染迭代到同一纹理中的 Alpha 混合问题 (OpenGL)

转载 作者:行者123 更新时间:2023-12-04 14:44:20 26 4
gpt4 key购买 nike

情景

我正在创建一个帧缓冲区对象并将纹理绑定(bind)到颜色附件 0。我没有使用深度缓冲区。创建后,我取消绑定(bind)它。

在稍后的某个时间点,帧缓冲区被绑定(bind),三角形条被渲染到它(某些部分部分透明),然后再次解除绑定(bind)。用不同的三角形条重复多次。

最终,绘制到主帧缓冲区的是一个纹理四边形,其纹理附加到我创建的帧缓冲区对象。

问题

我发现绘制到纹理中与其他三角形条重叠的三角形条的部分透明部分没有正确混合。它们似乎与白色混合,而不是纹理中已经存在的颜色。即使我用纯绿色填充纹理(例如),混合时拾取的颜色仍然是白色。

这是我用来执行所有这些操作的一些代码片段:

初始化

glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &framebuffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

渲染到纹理(迭代)
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// On the first render iteration, do_clear is true
if (do_clear)
{
glClearColor(r, g, b, a);
glClear(GL_COLOR_BUFFER_BIT);
}

// ... render the current triangle strip ...

glBindFramebuffer(GL_FRAMEBUFFER, 0);

将纹理渲染到主帧缓冲区
// Set up the texture (making no assumptions about current state)
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// Set up the vertex buffer (quad made up of triangle strip)
glBindBuffer(GL_ARRAY_BUFFER, vertices_id);
glVertexAttribPointer(VERTEX_ATTRIB_POSITION_TAG, 3, GL_FLOAT, GL_FALSE, sizeof(MyRenderVertex), BUFFER_OFFSET(0));
glEnableVertexAttribArray(VERTEX_ATTRIB_POSITION_TAG);
glVertexAttribPointer(VERTEX_ATTRIB_TEXCOORD_TAG, 2, GL_FLOAT, GL_FALSE, sizeof(MyRenderVertex), BUFFER_OFFSET(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(VERTEX_ATTRIB_TEXCOORD_TAG);
glVertexAttribPointer(VERTEX_ATTRIB_COLOR_TAG, 4, GL_FLOAT, GL_FALSE, sizeof(MyRenderVertex), BUFFER_OFFSET(5 * sizeof(GLfloat)));
glEnableVertexAttribArray(VERTEX_ATTRIB_COLOR_TAG);
glVertexAttribPointer(VERTEX_ATTRIB_NORMAL_TAG, 3, GL_FLOAT, GL_FALSE, sizeof(MyRenderVertex), BUFFER_OFFSET(9 * sizeof(GLfloat)));
glEnableVertexAttribArray(VERTEX_ATTRIB_NORMAL_TAG);

// Draw the textured geometry
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// Reset everything
glDisableVertexAttribArray(VERTEX_ATTRIB_POSITION_TAG);
glDisableVertexAttribArray(VERTEX_ATTRIB_TEXCOORD_TAG);
glDisableVertexAttribArray(VERTEX_ATTRIB_COLOR_TAG);
glDisableVertexAttribArray(VERTEX_ATTRIB_NORMAL_TAG);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindTexture(target, 0);
glActiveTexture(0);

我所看到的示例

您看到白线的部分是三角形带重叠的地方。它们应该是部分透明的,并与之前绘制的黑色混合。

Bad Blending

更新

自从发布此内容以来,我已经有了一些发现:
  • “白色”部分实际上是完全透明的,所以它只会显示纹理后面渲染的任何颜色
  • 我用随机放置的正方形替换了更复杂的三角形网格,这些正方形由从正方形一侧完全透明到另一侧完全不透明的顶点组成,我没有看到相同的混合问题。这是正方形的图片:

  • Good Blending

    所以这似乎是我正在使用的三角形网格而不是混合的问题。

    实际上,仔细观察“良好混合”图像,我可以看到当另一个正方形在其顶部渲染时,正方形的完全不透明部分实际上正在变亮。所以问题就在那里,只是没有那么极端。

    最佳答案

    当您渲染到纹理时,请尝试

    glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);

    代替:
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    情况是,当您渲染到纹理时,Alpha channel 也会被混合。

    为了清楚起见,让我们考虑在之前渲染的不透明三角形条上渲染半透明边缘。让边缘的 alpha 值为 0.5(源 alpha),渲染缓冲区中的 alpha 为 1.0(目标值)。所以结果值将是:
    r = SrcAlpha * SrcAlpha  + DstAlpha * (1.0 - SrcAlpha) = 0.5 * 0.5 + 0.5 * 0.5 = 0.5

    如您所见,渲染缓冲区中的 alpha 值不等于 1.0,正如您所期望的。结果,源颜色将与主帧缓冲区中的目标颜色混合。

    所以你不需要混合 Alpha channel 。例如,您可以简单地将源 Alpha 值添加到目标 Alpha 值,这可以通过使用 glBlendFuncSeparate 为 Alpha channel 指定不同的混合函数来实现。

    thisthis更多细节。

    还要确保您设置了正确的混合方程:
    glBlendEquation(GL_FUNC_ADD);

    this更多细节

    关于opengl - 多次渲染迭代到同一纹理中的 Alpha 混合问题 (OpenGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261455/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com