Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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中绘制大量像素_C++_Opengl_Graphics - Fatal编程技术网

C++ 在OpenGL中绘制大量像素

C++ 在OpenGL中绘制大量像素,c++,opengl,graphics,C++,Opengl,Graphics,我一直在做一些声音处理代码,现在我正在做一些可视化。我完成了光谱图的绘制,但绘制的速度太慢了 我正在使用OpenGL做2D绘图,这使得搜索帮助变得更加困难。而且我对OpenGL非常陌生,所以我不知道做事情的标准方式 我将每个像素的r、g、b值存储在一个大矩阵中。 每次我得到一个小的声音片段,我都会对它进行处理,并将它转换成一列像素。所有内容都向左移动1个像素,新行放在末尾 每次我重画的时候,我都会循环设置颜色并逐个绘制每个像素,这似乎是一种非常低效的方法 有更好的方法吗?有什么方法可以简单地移动

我一直在做一些声音处理代码,现在我正在做一些可视化。我完成了光谱图的绘制,但绘制的速度太慢了

我正在使用OpenGL做2D绘图,这使得搜索帮助变得更加困难。而且我对OpenGL非常陌生,所以我不知道做事情的标准方式

我将每个像素的r、g、b值存储在一个大矩阵中。 每次我得到一个小的声音片段,我都会对它进行处理,并将它转换成一列像素。所有内容都向左移动1个像素,新行放在末尾

每次我重画的时候,我都会循环设置颜色并逐个绘制每个像素,这似乎是一种非常低效的方法


有更好的方法吗?有什么方法可以简单地移动一堆像素吗?

您向图形卡传递的数据是否比像素多得多?如果FFT大小远大于绘图区域的高度或谱线的数量远大于其宽度,则可能发生这种情况。如果是这样的话,那么瓶颈可能是通过总线传递了太多的数据。尝试通过平均光谱线或拾取光谱线来减少光谱线的数量(对一组连续的光谱线在每个箱子中取最大值)。

它们是提高绘图速度的许多方法。 最简单的方法是分配一个RGB纹理,您将使用屏幕对齐的纹理四边形绘制该纹理。
每次你想画一条新线时,你可以使用glTexSubImage2d加载一个新的纹理子集,然后重新绘制四元体。

GL\u点
,。

我知道这是一个老问题,但是

使用循环缓冲区存储像素,然后使用适当的偏移量简单地调用glDrawPixels两次。类似于未经测试的C:

#define SIZE_X 800
#define SIZE_Y 600
unsigned char pixels[SIZE_Y][SIZE_X*2][3];
int start = 0;

void add_line(const unsigned char line[SIZE_Y][1][3]) {
    int i,j,coord=(start+SIZE_X)%(2*SIZE_X);
    for (i=0;i<SIZE_Y;++i) for (j=0;j<3;++j) pixels[i][coord][j] = line[i][0][j];
    start = (start+1) % (2*SIZE_X);
}
void draw(void) {
    int w;
    w = 2*SIZE_X-start;
    if (w!=0) glDrawPixels(w,SIZE_Y,GL_RGB,GL_UNSIGNED_BYTE,3*sizeof(unsigned char)*SIZE_Y*start+pixels);
    w = SIZE_X - w;
    if (w!=0) glDrawPixels(SIZE_X,SIZE_Y,GL_RGB,GL_UNSIGNED_BYTE,pixels);
}
#定义尺寸_x800
#定义尺寸_Y 600
无符号字符像素[SIZE_Y][SIZE_X*2][3];
int start=0;
void add_行(常量无符号字符行[SIZE_Y][1][3]){
int i,j,coord=(开始+大小X)%(2*大小X);

对于(i=0;我为什么不从光谱图构建位图,然后将位图用作gl四边形的纹理?好的,我找到了它,并完成了这项工作。我忘记提到的一件事是,我的像素值存储在一个循环缓冲区中,使事情变得稍微复杂一些,但它可以处理。我每次都从所有像素创建一个纹理我添加一条线,然后将其与四边形进行适当的映射。我可以使用四边形中的两个额外映射轻松处理与循环缓冲区的偏移。这远不是最优的,但比以前快得多。这是一个很好的建议,但我已经在处理了。这个问题是我效率极低的绘制方法。