Opengl / glsl / lwjgl是2d还是3d,而不是两者都是?

时间:2017-11-17 10:56:12

标签: opengl glsl lwjgl

所以我试图在我的3D场景上渲染基本的叠加层,目前我可以拥有3D场景或2D叠加层,我无法弄清楚如何获得两者

在我调用render的main方法中,我将特定的渲染函数移动到了管理器类,所以在主渲染中我调用:

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glEnable(GL_DEPTH_TEST);
        glEnable(GL_COLOR_MATERIAL);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();       

        glOrtho(-aspect, aspect, -1, 1, -10, 10);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        material.setColour(new Vector3f(1,1,1));            
        sLight.getPointLight().setPosition(camera.getPosition());
        sLight.setDirection(camera.getForward());

        DayCycle.getInstance().update(Time.getDelta());

        shader.updateUniforms(transform.getTransformation(), transform.getProjectedTransformation(), material); 
        //material is a wrapper class for textures and specular value etc
        //transform is a matrix wrapper for getting projected transformations, taking the camera position when its created
        WorldManager.renderAll(true); //true denotes yes to wireframe mode

        InterfaceManager.renderAll();

        glfwSwapBuffers(window); 
        glfwPollEvents();

如果我注释掉WorldManager.renderAll(),我会在屏幕的右侧显示小二维方格,如果我不评论它,我会得到世界渲染但没有小方块

WorldManager.renderAll()

    public static void renderAll(boolean wireframeMode)
    {
    RendererUtils.setWireframeMode(wireframeMode);

    for (String s : chunks.keySet())
    {
        Chunk actingChunk = chunks.get(s);

        Transform transform = new Transform();
        Shader shader = PhongShader.getInstance();
        transform.setTranslation(new Vector3f(actingChunk.getLocation().getX() * (Chunk.ChunkSize),0.0f, actingChunk.getLocation().getY() * (Chunk.ChunkSize)));
        transform.setScale(1.0f, 50f, 1.0f);
        shader.updateUniforms(transform.getTransformation(), transform.getProjectedTransformation(), actingChunk.getMaterial());
        shader.bind();

        actingChunk.getMesh().draw();
        //transform.setRotation(new Vector3f(0,0,0));
    }
    }

InterfaceManager.renderAll()

    public static void renderAll()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0, width, 0, height, -10, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glDisable(GL_CULL_FACE);
    glDisable(GL_DEPTH_TEST);
    RendererUtils.setWireframeMode(false);
    for (Interface i : interfaces)
    {
        Transform transform = new Transform();
        transform.setTranslation(new Vector3f(0,0,0));
        InterfaceShader.getInstance().updateUniforms(transform.getProjectedTransformation());
        InterfaceShader.getInstance().bind();

        i.getMesh().draw();
    }
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
}

当我取消注释WorldManager.renderAll()时,我得到了一个漂亮的三角形海洋(因为它的外观),但没有2D方形3D 随着它的评论,我得到一个漂亮的小方块,它的意思是什么,而没有别的2D square!

着色器在这里:https://pastebin.com/xWaWhQHy因为我觉得这篇文章太长了,无法让它们内联

我的问题是什么?我无法弄清楚它在哪里

编辑:如果我错过了任何相关代码,请告诉我,我会将其上传到pastebin

编辑2:在这里更新了我的代码以反映我在interfaceManager中删除了一个着色器,实际上得到了一个正方形来绘制:https://pastebin.com/pHHDsCvF用于着色器代码

编辑3:我已经确定它与我的界面着色器有关,如果我使用PhongShader而不是InterfaceShader那么它的工作原理我想要它

2 个答案:

答案 0 :(得分:1)

我建议你这样修改代码:

  WorldManager.renderAll(true); //true denotes yes to wireframe mode

  glClear(GL_DEPTH_BUFFER_BIT);
  InterfaceManager.renderAll();  

这样,您将在渲染2d界面之前清除深度缓冲区。

答案 1 :(得分:0)

问题在于,在将顶点传递给着色器后,我仍在对顶点应用变换。

通过在InterfaceShader实例中编辑转换(以及稍后废弃整个顶点着色器),小方块出现在正确的位置