Я пытаюсь загрузить изображение 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);
Я думал о чем-то подобном, поэтому я только пытаюсь загрузить одно изображение. Существует достаточно памяти для хранения одного 1024x512 (разрешение, которое я хочу отобразить) image – user929404
@ user929404: Если 'IMAGECOUNT' равно 1 в вашем коде, вы по-прежнему запрашиваете выделение большого объема. Убедитесь, что 'IMAGECOUNT' - небольшое число. – datenwolf
IMAGECOUNT is 1. Вот почему я продолжал говорить одно изображение. На самом деле, я могу запустить свою программу с 1024 изображениями размером 256x128. – user929404