Я написал программу, которая выполняет вычисления с разностными временными доменами на двумерной сетке. Я хочу взять данные о величине одного из компонентов поля (скажем, z-компонента магнитного поля, Гц), преобразовать величины в цветовой шкале, затем отобразить окончательную цветовую карту на экране. Следующая картинка в ссылке imgur была создана через Matlab, но я хотел бы сделать тот же тип изображения в OpenGL.OpenGL: Генерация 2D-текстуры из массива данных для отображения на квадце
Я использую 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, не является оптимальным с точки зрения производительности, но на данный момент все, что имеет значение, - это реализовать отображение поля в кратчайшие сроки, производительность (пока).
Что происходит не так? – BWG
Ничего не отображается на квадроцикле, оно просто остается черным. – user3186298
Ну, вы, кажется, не делаете никаких ошибок в noob. Вы пробовали заполнять «tex_Hz» случайными данными и рисовать? Тогда вы, по крайней мере, можете знать, является ли это проблемой данных или проблемой openGL. – BWG