简体   繁体   English

OpenGL:从数据数组生成2D纹理以显示在四边形上

[英]OpenGL: Generating a 2D texture from a data array to display on a quad

I have written a program which performs finite-difference time-domain calculations on a 2D grid. 我编写了一个在2D网格上执行时域有限差分计算的程序。 I am looking to take the magnitude data of one of the field components (let's say the z-component of the magnetic field, Hz), convert the magnitudes into a color scale, then display the final color map on the screen. 我正在寻找一个场分量(例如,磁场的z分量,Hz)的幅度数据,将幅度转换为色标,然后在屏幕上显示最终的颜色图。 The following picture in the imgur link was generated via matlab, but I would like to accomplish the same type of image in OpenGL. imgur链接中的以下图片是通过matlab生成的,但是我想在OpenGL中完成相同类型的图片。

http://imgur.com/8Rj77MK http://imgur.com/8Rj77MK

I am using GLFW to create the OpenGL window (800x480) with an orthographic projection using the following code: 我正在使用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<--//

The color data for the Hz field is stored by: Hz字段的颜色数据通过以下方式存储:

  • Creating a 1D int pointer of length 800x480*(3 colors) 创建长度为800x480 *(3种颜色)的1D int指针
  • Calculate and store the color values of the Hz field in the 1D pointer 计算并在1D指针中存储Hz字段的颜色值

From what I have read, the typical way to display a 2D texture in a window is to create a quad and apply the texture to the quad. 据我了解,在窗口中显示2D纹理的典型方法是创建一个四边形并将纹理应用于四边形。 I can successfully create the quad, and have successfully generated the color data (verified with matlab), but I am having trouble creating the texture to apply to the quad. 我可以成功创建四边形,并且已经成功生成了颜色数据(已通过matlab验证),但是我无法创建要应用于四边形的纹理。

My code to generate the texture is: 我生成纹理的代码是:

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);
}

The problem which occurs is that the quad remains black. 发生的问题是四边形保持黑色。

***I know copying data back into host memory to then create a GL texture is not optimal in terms of performance, but at this point all that matters is implementing the field display on the shortest timescale possible, not achieving optimal performance (yet). ***我知道将数据复制回主机内存以创建GL纹理在性能上不是最佳的,但是目前最重要的是在尽可能短的时间范围内实现现场显示,但尚未达到最佳性能(尚未) 。

Fixed it. 修复。 When using the GL_INT flag in glTexImage2D(...) the color scale ranges over all values of a signed int , and I was using a color scale from 0-255 for each channel, which is essentially 0 using GL_INT. 当在glTexImage2D(...)中使用GL_INT标志时,色标的范围涵盖一个有符号int的所有值,并且我为每个通道使用的色标范围是0-255,使用GL_INT基本上是0。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM