所以我试图在我的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方形 随着它的评论,我得到一个漂亮的小方块,它的意思是什么,而没有别的
着色器在这里:https://pastebin.com/xWaWhQHy因为我觉得这篇文章太长了,无法让它们内联
我的问题是什么?我无法弄清楚它在哪里
编辑:如果我错过了任何相关代码,请告诉我,我会将其上传到pastebin
编辑2:在这里更新了我的代码以反映我在interfaceManager中删除了一个着色器,实际上得到了一个正方形来绘制:https://pastebin.com/pHHDsCvF用于着色器代码
编辑3:我已经确定它与我的界面着色器有关,如果我使用PhongShader而不是InterfaceShader那么它的工作原理我想要它
答案 0 :(得分:1)
我建议你这样修改代码:
WorldManager.renderAll(true); //true denotes yes to wireframe mode
glClear(GL_DEPTH_BUFFER_BIT);
InterfaceManager.renderAll();
这样,您将在渲染2d界面之前清除深度缓冲区。
答案 1 :(得分:0)
问题在于,在将顶点传递给着色器后,我仍在对顶点应用变换。
通过在InterfaceShader实例中编辑转换(以及稍后废弃整个顶点着色器),小方块出现在正确的位置