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

时间:2017-05-15 18:28:50

标签: c++ opengl

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

这基本上就是我正在努力的目标:

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

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

另外,我不提供代码,因为这不是我想要的,我正在寻找概念和数学。

1 个答案:

答案 0 :(得分:2)

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

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来构建相关矩阵。