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

标签 c++ opengl

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

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

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

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

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

最佳答案

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

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构建有问题的矩阵。

关于c++ - 如何使用屏幕坐标绘制 OpenGL 图元(GL_POINT、GL_LINE 等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43986450/

相关文章:

c++ - 使用右值引用成员?

java - 绘制图形看起来像这样

c++ - glReadPixels 返回不正确的值

c - 主线程和其他线程有什么区别?

c++ - std函数下限不能按预期工作吗?

c++ - 做工作而不是等待 glMapBuffer

c++ - calibrateCamera opencv 功能不起作用

C++ 错误 : redefinition of matrix class

java - OpenGL 透视图沿 z 轴扭曲场景远超预期

c++ - 为什么使用 glDrawElements() 会导致段错误?