У меня есть размерность NxM массива. Тип данных двойной, и их значения могут варьироваться от 0,000001 до 1,0. Я хочу показать их с помощью OpenGL с цветами в пикселях NxM, например. 0.0001 ~ 0.0005 будет красным, 0.0005 ~ 0.001 будет светло-красным, как изображение с легендой для разных диапазонов.с использованием OpenGL для назначения цвета пикселам
Я думал, что должен использовать текстуру для эффективности, но я не совсем понимаю, как сопоставить значение в массиве с текстурой. Нужно ли сначала определять текстуру, как легенду? Как значение в массиве будет использовать цвет в текстуре?
Или мне нужно создать таблицу поиска цветов и использовать glDrawPixels? Как определить таблицу цветов в этом случае?
Следуя подходу, опубликованному @Josef Rissling, я определил легенду, затем каждый пиксель получает индекс в позиции легенды. В настоящее время я использую glDrawPixels(). Я полагаю, что каждая позиция легенды содержит значения R, G, B. Как установить glPixelTransfer и glPixelMap()? Код, вставленный ниже, дает мне только черный экран.
GLuint legend_image[1024][3]; // it contains { {0,0,255}, {0,0,254}, ...}
// GL initialization;
glutInit(&c, &argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(width_, height_);
glutCreateWindow("GPU render");
// allocate buffer handle
glGenBuffers(1, &buffer_obj_);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, buffer_obj_);
// allocate GPU memory
glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, width_ * height_, NULL, GL_DYNAMIC_DRAW_ARB);
// request a CUDA C name for this buffer
CUDA_CALL(cudaGraphicsGLRegisterBuffer(&res_, buffer_obj_, cudaGraphicsMapFlagsNone));
glPixelTransferi(GL_MAP_COLOR, true);
glPixelMapuiv(GL_PIXEL_MAP_I_TO_I, 1024, legend_image[0]);
glutDisplayFunc(draw_func);
glutIdleFunc(idle_func);
glutMainLoop();
void idle_func()
{
// cuda kernel to do calculation, and then convert to pixel legend position which is pointed by dev_ptr.
cudaGraphicsMapResources(1, &res_, 0);
unsigned int* dev_ptr;
size_t size;
cudaGraphicsResourceGetMappedPointer((void**)&dev_ptr, &size, res_);
cuda_kernel(dev_ptr);
cudaGraphicsUnmapResources(1, &res_, 0);
glutPostRedisplay();
}
void draw_func()
{
glDrawPixels(width_, height_, GL_COLOR_INDEX, GL_UNSIGNED_INT, 0);
glutSwapBuffers();
}
// some cleanup code...
Я использую C++. и я занимаюсь взаимодействием CUDA/OpenGL. Таким образом, значение в вычисляемом ядре CUDA будет преобразовано в позицию легенды пикселей (например, вы опубликовали). И следующий шаг - использовать эту позицию, чтобы получить цвет – stevenhz