Чтение jpg текстуры для OpenGL в c - PullRequest
3 голосов
/ 07 октября 2011

Это 1024 х 512 JPG.
Переменная size возвращает 84793.
Одна вещь, которую я не понимаю, это размер файла 84793, когда 1024 * 512 = 524288.
Я думаю, что это будет * 3 так как 3 канала на пиксель.
Переменная count возвращает 65.
Сейчас я получаю местоположение чтения нарушения прав доступа в этой строке, когда я устанавливаю параметры текстуры OpenGL:

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, texWidth, texHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, texPtr);

Где texWidth и texHeight, где ширина и высота снизу.

Вот что у меня сейчас:

int width = 1024;
int height = 512;
long size  = 0;
GLubyte * data;
FILE * file;
char name[100];
int count;

int test;

strcpy(name, filename);
// open texture data
file = fopen( name, "r" );
if ( file == NULL )
{
fputs ("File error",stderr); 
exit (1);
 }
 fseek (file , 0 , SEEK_END);
 size = ftell( file );
 rewind(file);
// allocate buffer
data = (unsigned char *)malloc( sizeof(char)*size );

count = (int) fread (data,sizeof(unsigned char) ,size,file);
fclose( file );

// allocate a texture name
glGenTextures( 1, &dayGLTexture );

initTexture(dayGLTexture, width, height, data);

Ответы [ 2 ]

6 голосов
/ 07 октября 2011

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

Есть количество библиотек , которые вы можете использовать для этого, для различных форматов изображений.Вы также должны прочитать о , как OpenGL понимает данные пикселей, которые вы ему предоставляете , а также понять, что означает параметр внутреннего формата изображения .

2 голосов
/ 07 октября 2011

Вы не можете напрямую передавать файлы изображений в OpenGL. Файлы изображений являются контейнерами. Данные, которые они содержат, должны быть сначала распакованы и декодированы. Существуют некоторые форматы файлов, которые могут содержать данные в форме, непосредственно усваиваемой OpenGL (плоские данные), среди них TGA и BMP.

Однако вы должны НИКОГДА не передавать данные файла напрямую в какой-либо API (кроме случаев, когда вы создаете программу передачи или копирования файлов).

Чтение файла изображения всегда требует следующих шагов:

  • Чтение и интерпретация метаданных (либо заголовок, либо хвост, либо оба).
  • Подготовка промежуточных буферов и процесс чтения / декодирования на основе информации метаданных.
  • Считайте данные из файла и расшифруйте их (для плоских файлов это может потребовать некоторого изменения полей, маскировки и коррекции цвета). Сжатые данные должны быть сначала распакованы. JPEG - схема сжатия с потерями
  • Передать данные в OpenGL или просто сохранить их в буфере для дальнейшего использования.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...