将正交转换为OpenGL HUD的透视图

问题描述 投票:0回答:1

[我正在尝试在OpenGL中实现HUD,它将在查看窗口的前面以2D显示文本,在后面显示3D透视图(类似于HUD)。

我正在使用projectionView矩阵创建3D片段,然后切换到正交矩阵以渲染四边形。我设法使它在不使用正交矩阵的情况下也可以工作(请参见下文),但是由于某些原因,如果使用矩阵绘制3D对象,则2D文本会消失,如果仅呈现文本,则该2D文本会消失并正确显示。

基本渲染循环:

glm::mat4 projection, projectionView, windowMatrix;

projection = glm::perspective(glm::radians(camera.Zoom), 800.0f / 600.0f, 0.1f, 100.0f);
windowMatrix = glm::ortho(0.0f,800.0f,0.0f,600.0f);

while (!glfwWindowShouldClose(window))     //Render loop
{
    glm::mat4 view = camera.GetViewMatrix();
    projectionView = projection * view;
    //Update the Uniform
    threeDShader->setMat4("projection", projectionView);

    //Render() calls glDrawElements()
    threeDObject->Render();

    //Update the Uniform
    textShader->setMat4("projection", windowMatrix);

    //Render params = text, xPos, yPos, scale, color
    //RenderText() calls glDrawArrays()
    textHUD->RenderText("Hello World!", 25.0f, 25.0f, 1.0f, glm::vec3(0.9, 0.2f, 0.8f));
}

textShader顶点着色器是:

#version 420 core
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
out vec2 TexCoords;

uniform mat4 projection;

void main()
{
    gl_Position = vec4(vertex.xy * vec2(2.0/800,2.0/600) - vec2(1,1), 0.0f, 1.0f);   <----(1)

    //gl_Position = projection * vec4(vertex.xy, 0.0f, 1.0f);   <----(2)
    TexCoords = vertex.zw;
}

顶点着色器代码中的第(1)行明确指出了屏幕上的位置,可在显示文本时将其他3D对象置于背景中。我宁愿使用使用正交矩阵的第(2)行(更改分辨率会更整洁),但是出于某种原因,当没有其他3D对象被渲染时,该方法可以工作,但是当场景中渲染3D对象时,它就消失了。它们都使用单独的矩阵,然后绘制其顶点/片段,因此,我认为它们不应相互干扰。

每个片段着色器都是相同的,应该不成问题。我认为这可能与透视矩阵的近裁剪平面有关,但是对于独立的绘制调用来说,这应该不是问题。

[我也尝试用类似于透视矩阵的近和远裁剪平面实现正交矩阵,但是没有成功。

c++ opengl glm-math vertex-shader hud
1个回答
0
投票

但是由于某些原因,当没有其他3D对象被渲染时,该方法仍然有效

我想,threeDObject->Render();textHUD->RenderText分别由glUseProgram安装着色器程序。

[glUseProgram更改当前安装程序的默认统一块中的统一变量。

您已经安装了着色器程序,然后才能更改制服:(在下面,我建议sahder程序类具有方法glUniform*,该方法将安装该程序)

glUniform*
© www.soinside.com 2019 - 2024. All rights reserved.