如何使用屏幕坐标绘制 OpenGL 图元(GL_POINT、GL_LINE 等)?

Posted

技术标签:

【中文标题】如何使用屏幕坐标绘制 OpenGL 图元(GL_POINT、GL_LINE 等)?【英文标题】:How to draw OpenGL primitives (GL_POINT, GL_LINE, etc) using screen coordinates? 【发布时间】:2017-05-15 18:28:49 【问题描述】:

我正在编写一个可以使用屏幕坐标绘制点、线和矩形的 OpenGL 库。但是,我不知道如何将屏幕坐标转换为剪辑或相机坐标。我正在使用现代 OpenGL(顶点数组和顶点缓冲区,以及着色器)。

这基本上是我正在努力的方向:

DrawPoint(10, 10, 5); // draws a point at pixel 10, 10 with a radius of 5

绘制线条和矩形的概念相同。

另外,我没有提供代码,因为那不是我要找的东西,我要找的是概念和数学。

【问题讨论】:

【参考方案1】:

您可能想要的是正交投影矩阵。此代码将进入您的绘图循环:

int width = getFramebufferWidth();
int height = getFramebufferHeight();
glm::mat4 mvp = glm::ortho(0, width, 0, height);

glUniformMatrix4fv(glGetUniformLocation(program, "mvp"), 1, false, glm::value_ptr(mvp));

glViewport(0, width, 0, height);
//Draw the Objects, clear the screen, whatever it is you need to do.

然后,在您的顶点着色器中,您将拥有如下内容:

#version 330

layout(location = 0) in vec2 position;

uniform mat4 mvp;

void main() 
    gl_Position = mvp * vec4(position, 0, 1);

然后,当您指定要在位置<10, 10> 绘制的东西时,它会在该位置绘制。

此代码使用GLM 构建相关矩阵。

【讨论】:

以上是关于如何使用屏幕坐标绘制 OpenGL 图元(GL_POINT、GL_LINE 等)?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL

我的OpenGL学习进阶之旅介绍一下OpenGL ES的图元装配:坐标系统透视分割视口变化

我的OpenGL学习进阶之旅介绍一下OpenGL ES的图元装配:坐标系统透视分割视口变化

Modern OpenGL 3.x 及更高版本如何绘制图元?

我的OpenGL学习进阶之旅介绍一下 图元的类型:三角形直线和点精灵

我的OpenGL学习进阶之旅介绍一下OpenGL ES的 光栅化 : 剔除多边形偏移