2014-01-13 4 views
0

Я пытаюсь загрузить изображение jpeg в текстуру, которую я буду использовать для рендеринга томов. Однако изображение не загружается (отображается только белый прямоугольник), когда я пытаюсь загрузить jpeg размером более 256x128 пикселей.Невозможно загрузить изображение в текстуру OpenGL, если оно больше 256x128

Я использую OpenCV для преобразования jpeg в необработанные значения. Это звучит как overkill, но у меня уже был OpenCV. Я открыт для использования другой библиотеки

Мой код может показаться странным, но это потому, что я использую значения яркости, но также использую альфа-значение. В результате я беру значение яркости и использую его по каналам RGBA.

Этот код работал, когда я использовал необработанные данные яркости. Но теперь я просто пытаюсь загрузить одно jpeg-изображение. (Это работает, когда мое изображение 256x128, но терпит неудачу, если он больше)

Моя текстура код загрузки:

unsigned char* chRGBABuffer = new unsigned char[IMAGEWIDTH * IMAGEHEIGHT * IMAGECOUNT * 4]; 

//Only create 1 3D texture now 
glGenTextures(1, (GLuint*)&textureID3D); 

// Set the properties of the texture. 
glBindTexture(GL_TEXTURE_3D, textureID3D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

// Convert the data to RGBA data. 
// Here we are simply putting the same value to R, G, B and A channels. 
// This can be changed depending on the source data 
// Usually for raw data, the alpha value will 
// be constructed by a threshold value given by the user 
for (int i = 0; i < IMAGECOUNT; ++i) 
{ 
    cv::Mat image; 
    image = cv::imread(filename, CV_LOAD_IMAGE_GRAYSCALE); 
    unsigned char * chBuffer = image.data; 

    if (!image.data)        // Check for invalid input 
    { 
     fprintf(stderr, "Could not open or find image\n"); 
     return -1; 
    } 

    for (int nIndx = 0; nIndx < IMAGEWIDTH * IMAGEHEIGHT; ++nIndx) 
    { 
     chRGBABuffer[nIndx * 4] = chBuffer[nIndx]; 
     chRGBABuffer[nIndx * 4 + 1] = chBuffer[nIndx]; 
     chRGBABuffer[nIndx * 4 + 2] = chBuffer[nIndx]; 
     chRGBABuffer[nIndx * 4 + 3] = chBuffer[nIndx]; 
    } 
} 

glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, IMAGEWIDTH, IMAGEHEIGHT, IMAGECOUNT, 0, 
    GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)chRGBABuffer); 
glBindTexture(GL_TEXTURE_3D, 0); 

ответ

0

Возможно, вы просто не хватает памяти текстуры. Объемные изображения - это свиньи памяти, и только несколько реализаций OpenGL способны обмениваться частями 3D-текстуры по требованию (при значительном падении производительности).

+0

Я думал о чем-то подобном, поэтому я только пытаюсь загрузить одно изображение. Существует достаточно памяти для хранения одного 1024x512 (разрешение, которое я хочу отобразить) image – user929404

+0

@ user929404: Если 'IMAGECOUNT' равно 1 в вашем коде, вы по-прежнему запрашиваете выделение большого объема. Убедитесь, что 'IMAGECOUNT' - небольшое число. – datenwolf

+0

IMAGECOUNT is 1. Вот почему я продолжал говорить одно изображение. На самом деле, я могу запустить свою программу с 1024 изображениями размером 256x128. – user929404

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