2013-02-21 3 views
3

У меня два изображения, оба - 24 цвета .bmp 32x32 пикселей. Если я загружаю один с OpenGL, он работает, если я загружаю другой OpenGL, он просто показывает черные и белые линии.Почему OpenGL правильно отображает загруженное изображение?

Есть ли что-то другое, что может быть другим, не позволяя одному из изображений показывать?

Это один не работает в коде:

grass1.bmp http://turboimg.com/p/aur1361433642q.bmp

Это один делает работу в коде:

grass.bmp http://turboimg.com/p/udj1361433715c.bmp

Также проверяется информация размер и размер заголовка файла. Оба изображения были 40 на info и 14 на размер файла. Оба изображения biWidth и BiHeight были 32x32.

Это показывает, как я текстурировать гекс с травой изображения

//GRASS 
glTexImage2d(GL_TEXTURE_2D,Level,Colorcomps,sGrass,tGrass,Border,GL_RGB,GL_UNSIGNED_BYTE,grass); 
glLoadName(1); 
glBegin(GL_POLYGON); 
    for I := 0 to 6 do 
    begin 
     glTexCoord2f(COS(i/6.0*2*PI),SIN(i/6.0*2*pi)); 
     glVertex3f((((COS(i/6.0*2*PI)/12)+offsetx)+0.2),((SIN(i/6.0*2*pi)/12)+offsety),-2); 
    end; 
glEnd; 

grass является указателем и заполняется следующим образом:

grass := Readbitmap('Grass.bmp',sGrass,tGrass); 

И как я могу получить данные изображения (которые должны быть ОК, поскольку он работает с другими изображениями, я действительно думаю, что это что-то еще об изображении, который сделает два разных)?

Function TFCreateMap.ReadBitmap(const FilePath:String;var sWidth,tHeight:GLsizei):pointer; 
const 
    szh=SizeOf(TBitmapFileHeader); 
    szi=SizeOf(TBitmapInfoHeader); 
var 
    bmpfile: file; 
    bfh:TBitmapFileHeader; 
    bmi:TBitmapInfoHeader; 
    t:byte; 
    x, 
    fpos, 
    size: integer; 
begin 
    assignfile(bmpfile,FilePath); 
    reset(bmpfile,1); 
    size := FileSize(bmpfile)-szh-szi; 
    blockread(bmpfile,bfh,szh); 
    if bfh.bfType<>$4D42 then 
    raise EinvalidGraphic.Create('Invalid Bitmap'); 
    blockread(bmpfile,bmi,szi); 
    with bmi do 
    begin 
    sWidth := biWidth; 
    tHeight := biHeight; 
    end; 
    getmem(result,size); 
    blockread(bmpfile,result^,size); 
    for x := 0 to sWidth*tHeight-1 do 
    with TWrap(result^)[x] do 
    begin 
    t := r; 
    r := b; 
    b := t; 
    end; 
end; 
+0

Трудно сравнивать эти изображения, если мы их не имеем, но попробуйте для проверки экземпляра значение 'biHeight' структуры' TBitmapInfoHeader'. Это может быть отрицательное значение, и, возможно, функция, с которой вы передаете это значение, не принимает отрицательных значений. Но это просто предположение, поскольку я не знаю этих изображений, и вы не показали, что вы делаете с помощью этого метода ReadBitmap. – TLama

+0

Я проверю и посмотрю, есть ли разница в значениях, дайте мне несколько минут. Но с помощью ReadBitmap я просто удаляю заголовок и заголовок файла перед отправкой данных в opengl. Хранение данных в указатель под названием «трава». Где он используется вверх. Я могу попытаться предоставить ссылки на изображения, но не уверен, загрузил ли их на сайт фотографии, если он каким-либо образом изменит их. но сделают оба в течение нескольких минут. –

+0

обновленный пост с изображениями. и информация о заголовке/высоте –

ответ

4

Ваши битмапы отличаются по меньшей мере в битовой глубине. Тот, который не позволяет загрузить, является 8-битным, а рабочий - 24-битным. Вам нужно преобразовать 8-битную растровую карту в 24-разрядную (из-за используемого значения параметра format в вызове функции glTexImage2D).

обзор Код:

Я сделал обзор кода и вот результат; следующий код использует поток файлов для чтения файла (поскольку я не являюсь поклонником подпрограмм ввода-вывода старого стиля, так или иначе вы забыли о закрытии файла), удаляет часть вращения цветового канала, которая была, поскольку @Rob указал неправильно (по причине, упомянутой ниже). Я добавил проверку на необходимости битового значения глубины (который должен быть 24-бит с format флагом вы будете использовать для вызова в glTexImage2D функции):

function TFCreateMap.ReadBitmap(const AFilePath: string; var AWidth, 
    AHeight: GLsizei): Pointer; 
var 
    DataSize: Integer; 
    FileStream: TFileStream; 
    FileHeader: TBitmapFileHeader; 
    InfoHeader: TBitmapInfoHeader; 
const 
    FileTypeBitmap = $4D42; 
    FileHeaderSize = SizeOf(TBitmapFileHeader); 
    InfoHeaderSize = SizeOf(TBitmapInfoHeader); 
begin 
    Result := nil;        

    FileStream := TFileStream.Create(AFilePath, fmOpenRead); 
    try 
    FileStream.ReadBuffer(FileHeader, FileHeaderSize); 
    if (FileHeader.bfType <> FileTypeBitmap) then 
     raise EinvalidGraphic.Create('Invalid file type!'); 

    FileStream.ReadBuffer(InfoHeader, InfoHeaderSize); 
    if (InfoHeader.biBitCount <> 24) then 
     raise EinvalidGraphic.Create('Invalid bit depth!'); 

    DataSize := FileStream.Size - FileHeaderSize - InfoHeaderSize; 
    GetMem(Result, DataSize); 
    FileStream.ReadBuffer(Result^, DataSize); 

    AWidth := InfoHeader.biWidth; 
    AHeight := InfoHeader.biHeight;  
    finally 
    FileStream.Free; 
    end;  
end; 

Теперь причина, почему я удалил цвет канальное вращение; У меня почти нет опыта работы с OpenGL, но мне что-то говорит, что значение параметра format функции glTexImage2D может упростить эту часть, потому что я бы сказал, что функция затем ожидает, что матрица пикселов BGR для своего параметра data и вот как ваши растровые изображения сохраняются.Так что я думаю, что вы можете оставить вращение цветового канала и вызвать функцию glTexImage2D с GL_BGR значением format параметра:

glTexImage2D(GL_TEXTURE_2D, Level, Colorcomps, sGrass, tGrass, Border, GL_BGR, 
    GL_UNSIGNED_BYTE, grass); 
... 
+0

Посмотрев на [альтернативный путь] (http://forum.vingrad.ru/forum/s/4ad5ff79dd9daa2d80afdfe69ef94a99/topic-263976.html) и выполнив простой тест, я могу подтвердить свое ожидание. Вы можете удалить вращение цветового канала и просто использовать значение 'GL_BGR' для параметра' format'. – TLama

+0

Да, это нужно было настроить цвет, чтобы читать, поскольку мне сказали, что opengl читает в RGB, где окна сохраняют его как BGR .. Я не видел опции для GL_BGR в opengGL, но рад его там: D. Thansk alot –

+0

Добро пожаловать! – TLama

2

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

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