繁体   English   中英

将正交切换到 OpenGL HUD 的透视

[英]Switching Ortho to perspective for OpenGL HUD

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

我正在使用一个投影视图矩阵创建我的 3D 片段,然后切换到一个正交矩阵来渲染我的四边形。 我已经设法在没有正交矩阵的情况下使其工作(见下文),但出于某种原因,如果我绘制 3D 对象使用矩阵时,我的 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 对象时消失. 他们都使用单独的矩阵然后绘制他们的顶点/片段,所以在我看来他们不应该相互干扰。

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

我还尝试使用类似于透视矩阵的近距和远距剪切平面来实现正交矩阵,但没有成功。

但由于某种原因,当没有其他 3D 对象被渲染时有效

我猜,那个threeDObject->Render(); textHUD->RenderText分别通过glUseProgram安装着色器程序。

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

在更改制服之前,您已经安装了着色器程序:
(在下面我建议 sahder 程序类有一个方法use() ,它安装程序)

while (!glfwWindowShouldClose(window))     //Render loop
{
    glm::mat4 view = camera.GetViewMatrix();
    projectionView = projection * view;

    // Install 3D shader program and update the Uniform
    threeDShader->use();
    threeDShader->setMat4("projection", projectionView);

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

    // Install text shader program and update the Uniform
    textShader->use();
    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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM