如何解决使用 OpenGLES2 在 3D 场景上绘制 2D 文本?
我正在尝试在 3D 场景上渲染 2D 文本。 2D 文本使用 TTF 字体中的 freetype 加载,并使用正交投影进行渲染,场景使用我的相机使用透视投影。我已经修改了 this Learn OpenGL tutorial for text rendering 中的代码。我可以单独渲染文本和 3D 场景,但是将它们一起绘制时不会出现 2D 文本。
我的渲染功能:
void Engine::render()
{
std::string fpsstr = std::to_string(fps).substr(0,std::to_string(fps).find(".") + 3);
glViewport(0,surface_width,surface_height);
glClearColor(0.53f,0.8f,0.92f,1.0f);
glEnable(GL_DEPTH_TEST);
glFrontFace(GL_ccw);
glCullFace(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 3D scene gets rendered here
scene->render(display,surface,deltaTime);
//
gldisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
// Text gets rendered here
debugText.renderText(fpsstr,25.0f,1.0f,glm::vec3(0.0,0.0,0.0));
//
gldisable(GL_BLEND);
eglSwapBuffers(display,surface);
}
文本投影是一个成员变量(glm::mat4
),它在创建文本渲染类的过程中被初始化,如下所示:
...
projection = glm::ortho(0.0f,static_cast<float>(screenWidth),0.0f,static_cast<float>(screenHeight));
...
我的渲染文本功能:
void Font::renderText(std::string text,float x,float y,float scale,glm::vec3 colour)
{
// activate corresponding render state
textShader.use();
textShader.setMat4("projection",projection);
textShader.setVec3("textColor",colour);
glActiveTexture(GL_TEXTURE0);
// iterate through all characters
std::string::const_iterator c;
for (c = text.begin(); c != text.end(); c++)
{
Character ch = characters[*c];
float xpos = x + ch.bearing.x * scale;
float ypos = y - (ch.size.y - ch.bearing.y) * scale;
float w = ch.size.x * scale;
float h = ch.size.y * scale;
// update VBO for each character
float vertices[6][4] = {
{ xpos,ypos + h,0.0f },{ xpos,ypos,1.0f },{ xpos + w,0.0f }
};
// render glyph texture over quad
glBindTexture(GL_TEXTURE_2D,ch.textureID);
// update content of VBO memory
glBindBuffer(GL_ARRAY_BUFFER,VBO);
glBufferSubData(GL_ARRAY_BUFFER,sizeof(vertices),vertices);
glBindBuffer(GL_ARRAY_BUFFER,0);
// render quad
glDrawArrays(GL_TRIANGLES,6);
// Now advance cursors for next glyph (note that advance is number of 1/64 pixels)
x += (ch.advance >> 6) * scale; // bitshift by 6 to get value in pixels (2^6 = 64)
}
glBindTexture(GL_TEXTURE_2D,0);
}
这里有两张图片,in this one I'm only rendering the text,在这张图片中,我启用了 3D 场景和文本,however only the 3D scene is displayed。
如何将这个 2D 透视图叠加在 3D 场景上,以便它们都得到渲染?
解决方法
您曾说过单独渲染它们(2D 四边形和 3D 场景)可以正常工作,但将它们一起渲染会导致 2D 四边形无法渲染。嗯,尝试检查对象的渲染顺序;确保正确绑定和解除绑定着色器。 您是否有特殊原因禁用了文本的深度测试(尝试启用它,看看是否能解决问题)?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。