【问题标题】:Draw 2D HUD elements over 3D rendered scene在 3D 渲染场景上绘制 2D HUD 元素
【发布时间】:2020-05-26 01:19:24
【问题描述】:

我搜索了这个,只找到了一个 2014 年的帖子,询问类似的情况。但是,由于我无法理解那里做了什么,我再次询问,特别是我的实施,希望这也能对这个话题有所了解。我对 c++ 和 openGL 还很陌生,所以请原谅愚蠢的错误。

我正在尝试为我的 3D 游戏实现一个简单的 2D HUD。现在,我的游戏已经完全渲染了,由于我的游戏中有一个绽放效果,我什至在屏幕四边形上渲染了我的游戏。 我现在想做的是在这个渲染的场景上放置一个 HUD,但是我似乎做不到。

我的游戏屏幕四边形是这样绘制的:

unsigned int quadVAO = 0;
unsigned int quadVBO;
void renderQuad()
{
    if (quadVAO == 0)
    {
        float quadVertices[] = {
            // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates.
            // texCoords
            0.0f, 1.0f,
            0.0f, 0.0f,
            1.0f, 0.0f,

            0.0f, 1.0f,
            1.0f, 0.0f,
            1.0f, 1.0f
        };
        // setup plane VAO
        glGenVertexArrays(1, &quadVAO);
        glGenBuffers(1, &quadVBO);
        glBindVertexArray(quadVAO);
        glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
    }
    glBindVertexArray(quadVAO);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glBindVertexArray(0);
}

我尝试做的是将我的renderQuad 方法更改为renderHUDquad 方法,基本上只是更改四边形的尺寸以使其显示在屏幕的左下角。 代码如下:

unsigned int HUDquadVAO = 0;
unsigned int HUDquadVBO;
void renderHUDQuad()
{
    if (HUDquadVAO == 0)
    {
        float HUDquadVertices[] = {
            // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates.
            // texCoords
            0.0f, 0.02f,
            0.0f, 0.0f,
            0.2f, 0.0f,

            0.0f, 0.02f,
            0.2f, 0.0f,
            0.2f, 0.02f
        };
        // setup plane VAO
        glGenVertexArrays(1, &HUDquadVAO);
        glGenBuffers(1, &HUDquadVBO);
        glBindVertexArray(HUDquadVAO);
        glBindBuffer(GL_ARRAY_BUFFER, HUDquadVBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(HUDquadVertices), &HUDquadVertices, GL_STATIC_DRAW);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
    }
    glBindVertexArray(HUDquadVAO);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glBindVertexArray(0);
}

因为这只需要一个小的绿色四边形,即玩家的健康栏,我正在考虑只为它分配一个绿色纹理或...... 但是,当像这样绘制我的两个四边形时:

// Third pass = Combined bloom pictures
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            bloomShader->use();
            // Set uniform for multiple layout uniforms
            bloomShader->setUniform("scene", 0);
            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, colorAndLightBuffers[0]);
            // Set uniform for multiple layout uniforms
            bloomShader->setUniform("bloomBlur", 1);
            glActiveTexture(GL_TEXTURE1);
            glBindTexture(GL_TEXTURE_2D, pingpongBuffer[horizontal == 0 ? 1 : 0]);
            bloomShader->setUniform("bloom", bloom);
            bloomShader->setUniform("exposure", exposure);
            renderQuad();

            renderHUDQuad();

            // Swap buffers
            glfwSwapBuffers(window);

我只得到了 HUD 元素,没有我之前画的任何东西,就好像屏幕的其余部分被渲染为黑色一样。我想我可以将它添加到旧缓冲区中,因为有办法做到这一点吗?

【问题讨论】:

  • 为什么要使用bloom shader来渲染HUD?如果您不希望这些效果影响 HUD 元素,则应在全屏效果后渲染 HUD。
  • 没错,是的,我将为此实现我自己的着色器!然而,这并不能真正回答为什么几乎整个屏幕仍然是黑色的问题,我担心。
  • 当我看到您的问题时,请确保您只能绘制开花的部分。确保您能够单独渲染 HUD 部分,而无需渲染部分;更好地使用不同的 VBO、VAO 和着色器。现在,渲染开花的部分,不要调用glfwSwapBuffers,然后渲染HUD(这一步可能需要透明度)并调用glfwSwapBuffers

标签: c++ opengl


【解决方案1】:

你确实搞砸了你的 GL 状态:

void renderHUDQuad() {
    if (HUDquadVAO == 0)
    {
        [...]
        glGenVertexArrays(1, &quadVAO);

你实际上在这个函数的其余部分使用了quadVAO,所以你用较小的那个覆盖了你的全屏四边形,这意味着你的场景的其余部分将从下一帧开始缩小到这个四边形......

【讨论】:

  • 非常对,哈哈,不过这会导致HUD根本不显示。
  • 好吧,正如@Nicol Bolas 已经提到的那样,实际上,完全不清楚您的绽放着色器应该出现什么。或者,也许您的深度测试正在丢弃它。没有看到相关代码很难判断。
  • 你需要看什么代码?专门为 HUD 制作的着色器应该做什么?
  • 实际上reproduces the issue的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
相关资源
最近更新 更多