2014-01-12 4 views
0

Я написал программу, которая выполняет вычисления с разностными временными доменами на двумерной сетке. Я хочу взять данные о величине одного из компонентов поля (скажем, z-компонента магнитного поля, Гц), преобразовать величины в цветовой шкале, затем отобразить окончательную цветовую карту на экране. Следующая картинка в ссылке imgur была создана через Matlab, но я хотел бы сделать тот же тип изображения в OpenGL.OpenGL: Генерация 2D-текстуры из массива данных для отображения на квадце

http://imgur.com/8Rj77MK

Я использую 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<--// 

Цветовые данные для поля Гц хранится:

  • Создание указателя длины 1D длиной 800x480 * (3 цвета)
  • Рассчитать и сохранить значения цвета поля Hz в 1D-указателе

Из того, что я прочитал, типичный способ отображения 2D-текстуры в окне - создать квадрант и применить текстуру к кваду. Я могу успешно создать квадрат и успешно сгенерировать данные о цвете (проверено с помощью Matlab), но у меня возникла проблема с созданием текстуры для применения к квадранту.

Мой код для создания текстуры:

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

Проблема, которая возникает в том, что четырехъядерный остается черным.

*** Я знаю, что копирование данных обратно в память хоста, чтобы создать текстуру GL, не является оптимальным с точки зрения производительности, но на данный момент все, что имеет значение, - это реализовать отображение поля в кратчайшие сроки, производительность (пока).

+0

Что происходит не так? – BWG

+0

Ничего не отображается на квадроцикле, оно просто остается черным. – user3186298

+0

Ну, вы, кажется, не делаете никаких ошибок в noob. Вы пробовали заполнять «tex_Hz» случайными данными и рисовать? Тогда вы, по крайней мере, можете знать, является ли это проблемой данных или проблемой openGL. – BWG

ответ

2

Исправлено. При использовании флага GL_INT в glTexImage2D (...) цветовая шкала изменяется по всем значениям подписанного int, и я использовал цветовую шкалу от 0 до 255 для каждого канала, которая по существу равна 0 с использованием GL_INT.