使用 OpenGLES2 在 3D 场景上绘制 2D 文本?

如何解决使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?