C++ OpenGL:从数据数组生成二维纹理以显示在四边形上

C++ OpenGL:从数据数组生成二维纹理以显示在四边形上,c++,opengl,texture2d,C++,Opengl,Texture2d,我写了一个程序,在二维网格上进行时域有限差分计算。我希望获取其中一个磁场分量(比如磁场的z分量,Hz)的大小数据,将大小转换为颜色比例,然后在屏幕上显示最终的颜色贴图。imgur链接中的以下图片是通过matlab生成的,但我希望在OpenGL中实现相同类型的图像 我正在使用GLFW使用以下代码创建具有正交投影的OpenGL窗口(800x480): //-->Construct GLFW Window<--// int WINDOW_WIDTH = 800*(xIndex/4000)

我写了一个程序,在二维网格上进行时域有限差分计算。我希望获取其中一个磁场分量(比如磁场的z分量,Hz)的大小数据,将大小转换为颜色比例,然后在屏幕上显示最终的颜色贴图。imgur链接中的以下图片是通过matlab生成的,但我希望在OpenGL中实现相同类型的图像

我正在使用GLFW使用以下代码创建具有正交投影的OpenGL窗口(800x480):

//-->Construct GLFW Window<--//
int WINDOW_WIDTH = 800*(xIndex/4000);
int WINDOW_HEIGHT = 480*(yIndex/2400);

GLFWwindow* window;
window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Hz Component Magnitude", NULL, NULL);

//GLFW terminate and error function setup not shown

glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, key_callback);

glewInit();

glfwGetFramebufferSize(window, &WINDOW_WIDTH, &WINDOW_HEIGHT);

glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//Create orthographic view
glMatrixMode(GL_PROJECTION);
glOrtho(0, 0, -1.f, 1.f, 1.f, -1.f);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glLoadIdentity();

glfwSwapBuffers(window);
glfwPollEvents();
//-->END Construct GLFW Window<--//


/-->Construct GLFW WindowEND Construct GLFW WindowStart of time loop更新Hz字段每隔100个时间步生成2D图像修复它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用0-255的色标,使用GL_INT基本上是0。

修复了它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用0-255的色标,使用GL_INT基本上是0。

修复了它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用0-255的色标,使用GL_INT基本上是0。

修复了它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用的色标范围为0-255,使用GL_INT时基本上为0。

四边形上没有显示任何内容,只是保持黑色。好吧,您似乎没有犯任何noob错误。你有没有尝试过用随机数据填充tex_Hz并绘制它?然后你至少可以知道这是数据问题还是openGL问题。等等。如果你没有任何东西可以画,我想你的
glOrtho(…)
z
值错了。最后两个参数应该是
-1,1
,而不是
1,-1
。修复了它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用0-255的色标,使用GL_INT基本上是0。感谢您花时间查看代码。我为这件事发疯了。很高兴你把它修好了。我实际上是在盯着那个
GL_INT
标志,但我从来没有用过它。我一直在做
GL\u UNSIGNED\u BYTE
之类的事情。四边形上没有显示任何内容,只是保持黑色。好吧,你似乎没有犯任何noob错误。你有没有尝试过用随机数据填充tex_Hz并绘制它?然后你至少可以知道这是数据问题还是openGL问题。等等。如果你没有任何东西可以画,我想你的
glOrtho(…)
z
值错了。最后两个参数应该是
-1,1
,而不是
1,-1
。修复了它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用0-255的色标,使用GL_INT基本上是0。感谢您花时间查看代码。我为这件事发疯了。很高兴你把它修好了。我实际上是在盯着那个
GL_INT
标志,但我从来没有用过它。我一直在做
GL\u UNSIGNED\u BYTE
之类的事情。四边形上没有显示任何内容,只是保持黑色。好吧,你似乎没有犯任何noob错误。你有没有尝试过用随机数据填充tex_Hz并绘制它?然后你至少可以知道这是数据问题还是openGL问题。等等。如果你没有任何东西可以画,我想你的
glOrtho(…)
z
值错了。最后两个参数应该是
-1,1
,而不是
1,-1
。修复了它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用0-255的色标,使用GL_INT基本上是0。感谢您花时间查看代码。我为这件事发疯了。很高兴你把它修好了。我实际上是在盯着那个
GL_INT
标志,但我从来没有用过它。我一直在做
GL\u UNSIGNED\u BYTE
之类的事情。四边形上没有显示任何内容,只是保持黑色。好吧,你似乎没有犯任何noob错误。你有没有尝试过用随机数据填充tex_Hz并绘制它?然后你至少可以知道这是数据问题还是openGL问题。等等。如果你没有任何东西可以画,我想你的
glOrtho(…)
z
值错了。最后两个参数应该是
-1,1
,而不是
1,-1
。修复了它。在glTexImage2D(…)中使用GL_INT标志时,色标范围覆盖有符号INT的所有值,我对每个通道使用0-255的色标,使用GL_INT基本上是0。感谢您花时间查看代码。我为这件事发疯了。很高兴你把它修好了。我实际上是在盯着那个
GL_INT
标志,但我从来没有用过它。我总是做
GL\u UNSIGNED\u BYTE
之类的事情。
int num_colors = 3;    //Number of colors per pixel
int tex_size = num_colors*WINDOW_WIDTH*WINDOW_HEIGHT;    //Number of entries in tex_Hz

int size = tex_size*sizeof(int);

//Create pointer for storing color map
int* tex_Hz = (int*)malloc(size);

for(int i = 0; i < tex_size; i++)    //Initialize colormap to 0
    tex_Hz[i] = 0;

//OpenCL buffer for the color map
cl::Buffer texture_mem(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, size, tex_Hz, &error);

//Generate a texture ID
GLuint tex_id;

glGenTextures(1, &tex_id);
glBindTexture(GL_TEXTURE_2D, tex_id);

    //*A bunch of irrelevant code*//

    //-->Start of time loop<--//

    //*A bunch of irrelevant code*//

//-->Update the Hz field<--//
time_loop_queue.enqueueNDRangeKernel(timeLoopKernels[1], 0, global_size, local_size);
time_loop_queue.finish();

//-->Generate 2D image every 100 time steps<--//
if(step%100 == 0)
{
    //Read colormap values from OpenCL buffer
    time_loop_queue.enqueueReadBuffer(texture_mem, NULL, 0, size, tex_Hz, NULL, NULL);
    time_loop_queue.finish();

    //Used only as a debug runtime check to make sure data copied back
    cout << tex_Hz[3*800*240 + 3*350] << "\n";

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_RGB, GL_INT, tex_Hz);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D, tex_id);

    //Draw quad and set texture coords
    glBegin(GL_QUADS);
    glTexCoord2d(0.0,0.0); glVertex2d(-1.0,-1.0);
    glTexCoord2d(1.0,0.0); glVertex2d(1.0,-1.0);
    glTexCoord2d(1.0,1.0); glVertex2d(1.0,1.0);
    glTexCoord2d(0.0,1.0); glVertex2d(-1.0,1.0);
    glEnd();

    glfwSwapBuffers(window);
}