Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数在OpenGL 3.3的两个指定点之间绘制一条线_C++_Opengl - Fatal编程技术网

C++ 函数在OpenGL 3.3的两个指定点之间绘制一条线

C++ 函数在OpenGL 3.3的两个指定点之间绘制一条线,c++,opengl,C++,Opengl,我一直在试图找到一种方法来创建一个函数,在OpenGL3.3中在两点之间画一条线。我不想使用GL\u行,因为那太难看了。我正在使用,但它是为基本的OpenGL编写的,与3.3不兼容,所以我不得不对它进行一些修改 目前,line方法按照库中提供的方式工作,最后稍作修改。在该方法计算出一条漂亮的线(顶点的坐标和颜色)所需的所有参数后,它不再使用glBegin工具将顶点放置在屏幕上,而是将它们存储在一个数组中。然后,我将该数组作为缓冲区数据传递给VBO,最后,我使用glDrawArrays绘制顶点 为

我一直在试图找到一种方法来创建一个函数,在OpenGL3.3中在两点之间画一条线。我不想使用
GL\u行
,因为那太难看了。我正在使用,但它是为基本的OpenGL编写的,与3.3不兼容,所以我不得不对它进行一些修改

目前,line方法按照库中提供的方式工作,最后稍作修改。在该方法计算出一条漂亮的线(顶点的坐标和颜色)所需的所有参数后,它不再使用glBegin工具将顶点放置在屏幕上,而是将它们存储在一个数组中。然后,我将该数组作为缓冲区数据传递给VBO,最后,我使用glDrawArrays绘制顶点

为了实现这一点,我已经指出VBO是GL_DYNAIC_DRAW,并且已经预先分配了数组所需的内存

在line方法中,我使用以下方法:

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
在此之后,我指定顶点属性并绘制线

这工作得非常好,但问题是它比库使用的基本OpenGL版本慢得多。为了测试这一点,我创建了两个程序(一个用于basic,一个用于core OpenGL),它们在一个渲染循环中绘制10000条线


我相信这是由于缓冲区数据与glBufferSubData的不断变化。我的问题是,我怎样才能使它更快(或者至少和基本的OpenGL一样快)?只是为了说明,我需要像在库中一样将其作为一种通用方法,因此在开始时指定多少行以及它们在程序期间的位置是不可能的。

缓冲任何内容(不仅在OpenGL中)的想法是在单个数据数组中积累一些小部分,然后转储(绑定/任何内容)这一切只需一次传球。因此,您需要的是将每个“绘制一条线”请求累积到一个缓冲区中(例如,作为一种解决方法,您可以使用具有动态大小的
std::vector
,但对于未来,您需要提出一个更智能的累积),然后当绘制时刻最终到来时,您只需绑定此缓冲区一次并清除它(或者不清楚,取决于你的意图)“我不想使用GL_线,因为那太难看了。”那么你用什么画线?三角形?我用的是三角形条。据我所知,Alex Larinov不是不断更新小缓冲区中的数据并绘制它,而是应该存储它,当我到达渲染循环的末尾时,将其全部发送到缓冲区并在一次调用中绘制,对吗?@NikolayGanev是的,但不要只局限于一个缓冲区,它可能是几个缓冲区,只是不太多,而不是“一行一个缓冲区”