title: OpenGL: Generating a 2D texture from a data array to display on a quad
body: <p>I have written a program which performs finite-difference time-domain calculations on a 2D grid. 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. The following picture in the imgur link was generated via matlab, but I would like to accomplish the same type of image in OpenGL.</p>
  
  <p><a href="http://imgur.com/8Rj77MK" rel="nofollow">http://imgur.com/8Rj77MK</a></p>
  
  <p>I am using GLFW to create the OpenGL window (800x480) with an orthographic projection using the following code:</p>
  
  <pre><code>//--&gt;Construct GLFW Window&lt;--//
  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, &amp;WINDOW_WIDTH, &amp;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();
  //--&gt;END Construct GLFW Window&lt;--//
  </code></pre>
  
  <p>The color data for the Hz field is stored by:</p>
  
  <ul>
  <li>Creating a 1D int pointer of length 800x480*(3 colors)</li>
  <li>Calculate and store the color values of the Hz field in the 1D pointer</li>
  </ul>
  
  <p>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. 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.</p>
  
  <p>My code to generate the texture is:</p>
  
  <pre><code>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 &lt; 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, &amp;error);
  
  //Generate a texture ID
  GLuint tex_id;
  
  glGenTextures(1, &amp;tex_id);
  glBindTexture(GL_TEXTURE_2D, tex_id);
  
      //*A bunch of irrelevant code*//
  
      //--&gt;Start of time loop&lt;--//
  
      //*A bunch of irrelevant code*//
  
  //--&gt;Update the Hz field&lt;--//
  time_loop_queue.enqueueNDRangeKernel(timeLoopKernels[1], 0, global_size, local_size);
  time_loop_queue.finish();
  
  //--&gt;Generate 2D image every 100 time steps&lt;--//
  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 &lt;&lt; tex_Hz[3*800*240 + 3*350] &lt;&lt; "\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);
  }
  </code></pre>
  
  <p>The problem which occurs is that the quad remains black.</p>
  
  <p>***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).</p>