2015-08-31 2 views
0

У меня есть размерность 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... 

ответ

0

Вы должны упомянуть, какой язык и который OPENGL версию вы используете ...

практичность зависит от того, какие функции вы используете для отображения, текстурных выборок не дешевы. Особенно, если вы уже не используете текстуру как массив (вам нужно сначала скопировать данные).

Но для вашего примера сопоставления: Вы можете создать текстуру легенды (в которой вы применили свое нелинейное цветовое пространство), что позволит вам отображать из диапазона значений цвет по смещению пикселей (где значение отображаемого цвета вранье). Общий случай будет, чем псевдо шейдера:

map(value) 
{ 
    pixelStartPosition, pixelEndPosition; 
    pixelRange = pixelEndPosition - pixelStartPosition; 
    valueNormalizer = 1.0/(valueMaximum - valueMinimum); 
    pixelLegendPosition = pixelStartPosition + pixelRange * ((value-valueMinimum) * valueNormalizer); 
    return pixelLegendPosition; 
} 

Скажем, у вас есть легенда текстуры с 2000 пикселей в диапазоне от 0 до 1999 со значением от 0 до 1:

pixelStartPosition=0 
pixelEndPosition=1999 
pixelRange = pixelEndPosition - pixelStartPosition // 1999 
valueNormalizer = 1.0/(valueMaximum - valueMinimum) // 1.0 
pixelLegendPosition = pixelStartPosition + pixelRange * ((value-valueMinimum) * valueNormalizer) 
// 0 + 1999 * ((value-0) * 1) ===> 1999 * value 

Если вам необходимо передать данные массива текстуре, есть несколько способов сделать это - но это зависит только от вашей версии/языка, но glTexImage2D - хорошее направление.

+0

Я использую C++. и я занимаюсь взаимодействием CUDA/OpenGL. Таким образом, значение в вычисляемом ядре CUDA будет преобразовано в позицию легенды пикселей (например, вы опубликовали). И следующий шаг - использовать эту позицию, чтобы получить цвет – stevenhz

Смежные вопросы