【发布时间】: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。