将 Ortho 切换为 OpenGL HUD 的透视图
Switching Ortho to perspective for OpenGL HUD
我正在尝试在 OpenGL 中实现一个 HUD,它将在视图的前面显示 2D 文本 window,在后面显示 3D 透视图(类似于 HUD)。
我正在使用 projectionView 矩阵创建我的 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 对象时消失.他们都使用单独的矩阵然后绘制他们的 vertices/fragments,所以在我看来他们不应该互相干扰。
每个片段着色器都是相同的,应该不是问题。我认为这可能与透视矩阵的近裁剪平面有关,但对于独立的绘制调用,这应该不是问题。
我也尝试过使用类似于透视矩阵的近远裁剪平面实现正交矩阵,但没有成功。
but for some reason works when no other 3D objects are rendered
我猜,threeDObject->Render();
分别textHUD->RenderText
通过glUseProgram
安装着色器程序。
glUniform*
更改当前安装程序的默认统一块中的统一变量。
您已经安装了着色器程序才能更改制服:
(在下面我建议,sahder 程序 class 有一个安装程序的方法 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));
}
我正在尝试在 OpenGL 中实现一个 HUD,它将在视图的前面显示 2D 文本 window,在后面显示 3D 透视图(类似于 HUD)。
我正在使用 projectionView 矩阵创建我的 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 对象时消失.他们都使用单独的矩阵然后绘制他们的 vertices/fragments,所以在我看来他们不应该互相干扰。
每个片段着色器都是相同的,应该不是问题。我认为这可能与透视矩阵的近裁剪平面有关,但对于独立的绘制调用,这应该不是问题。
我也尝试过使用类似于透视矩阵的近远裁剪平面实现正交矩阵,但没有成功。
but for some reason works when no other 3D objects are rendered
我猜,threeDObject->Render();
分别textHUD->RenderText
通过glUseProgram
安装着色器程序。
glUniform*
更改当前安装程序的默认统一块中的统一变量。
您已经安装了着色器程序才能更改制服:
(在下面我建议,sahder 程序 class 有一个安装程序的方法 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));
}