Основы компьютерной графики для программистов. Казанцев А.В. - 88 стр.

UptoLike

Составители: 

Основы компьютерной графики для программистов 88
____________________________________________________________________________________________________________________
http://www.ksu.ru/persons/9134.ru.html
For j:= 0 to ySize-1 do
begin
bits[(i*xSize+j)*3+0]:=
GetRValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
bits[(i*xSize+j)*3+1]:=
GetGValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
bits[(i*xSize+j)*3+2]:=
GetBValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
end;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
xSize, ySize,// здесь задается размер текстуры
0, GL_RGB, GL_UNSIGNED_BYTE, bits);
Result:=bits;
//FreeMem(bits);
bitmap.Free;
end;//function LoadBmpTexture
Как видим, внутри функции
LoadBmpTexture вызывается функция загрузки текстуры
glTexImage2D. Особенность загрузки текстур состоит в том, что в образе битовой карты
информация о пикселах хранится не в виде R-G-B, как это принято в формате
изображений DIB, а наоборот B-G-R, то есть первой идет компонента синего цвета,
затем зеленого и далее красного. Удобство функции
LoadBmpTexture также состоит в
том, что метод загрузки картинки из файла объекта
TBitmap автоматически преобразует
любые форматы DDB в универсальный формат DIB, так что нам остается только
правильно поменять местами расположение байтов тройки RGB, что и происходит в
двойном цикле:
For i:= 0 to xSize-1 do
For j:= 0 to ySize-1 do
begin
bits[(i*xSize+j)*3+0]:=
GetRValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
bits[(i*xSize+j)*3+1]:=
GetGValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
bits[(i*xSize+j)*3+2]:=
GetBValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
end;
Рассмотрим параметры функции glTexImage2D, как она использована в программе.
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
xSize, ySize, 0, GL_RGB,
GL_UNSIGNED_BYTE, bits
);
Первый параметр в этой функции может принимать только значение символической
константы
GL_TEXTURE_2D. Второй параметр указывает значение уровня детализации
текстуры. Уровень детализации задает уменьшение текстуры в заданное число раз с
применением алгоритмов Mipmap. По умолчанию используется значение 0. Третий
параметр задает количество цветовых компонент текстуры, может быть от 1 до 4.
Четвертый и пятый параметры задают ширину и высоту текстуры. Ширина должна
удовлетворять выражению 2
n
+2 x Border, где Border = 0 или 1, ширина границы
текстуры, задается в следующем, шестом параметре. Седьмой параметр задает формат
пикселов, может принимать следующие значения:
GL_COLOR_INDEX, GL_RED,
Основы компьютерной графики для программистов                                                                  88
____________________________________________________________________________________________________________________


  For j:= 0 to ySize-1 do
  begin
    bits[(i*xSize+j)*3+0]:=
GetRValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
    bits[(i*xSize+j)*3+1]:=
GetGValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
    bits[(i*xSize+j)*3+2]:=
GetBValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
  end;
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                    xSize, ySize,// здесь задается размер текстуры
                    0, GL_RGB, GL_UNSIGNED_BYTE, bits);
 Result:=bits;
 //FreeMem(bits);
 bitmap.Free;
end;//function LoadBmpTexture

Как видим, внутри функции LoadBmpTexture вызывается функция загрузки текстуры
glTexImage2D. Особенность загрузки текстур состоит в том, что в образе битовой карты
информация о пикселах хранится не в виде R-G-B, как это принято в формате
изображений DIB, а наоборот B-G-R, то есть первой идет компонента синего цвета,
затем зеленого и далее красного. Удобство функции LoadBmpTexture также состоит в
том, что метод загрузки картинки из файла объекта TBitmap автоматически преобразует
любые форматы DDB в универсальный формат DIB, так что нам остается только
правильно поменять местами расположение байтов тройки RGB, что и происходит в
двойном цикле:

 For i:= 0 to xSize-1 do
  For j:= 0 to ySize-1 do
  begin
    bits[(i*xSize+j)*3+0]:=
GetRValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
    bits[(i*xSize+j)*3+1]:=
GetGValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
    bits[(i*xSize+j)*3+2]:=
GetBValue(bitmap.Canvas.Pixels[j,xSize-1-i]);
  end;

Рассмотрим параметры функции glTexImage2D, как она использована в программе.
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
               xSize, ySize, 0, GL_RGB,
               GL_UNSIGNED_BYTE, bits
             );
Первый параметр в этой функции может принимать только значение символической
константы GL_TEXTURE_2D. Второй параметр указывает значение уровня детализации
текстуры. Уровень детализации задает уменьшение текстуры в заданное число раз с
применением алгоритмов Mipmap. По умолчанию используется значение 0. Третий
параметр задает количество цветовых компонент текстуры, может быть от 1 до 4.
Четвертый и пятый параметры задают ширину и высоту текстуры. Ширина должна
удовлетворять выражению 2n+2 x Border, где Border = 0 или 1, ширина границы
текстуры, задается в следующем, шестом параметре. Седьмой параметр задает формат
пикселов, может принимать следующие значения: GL_COLOR_INDEX, GL_RED,

http://www.ksu.ru/persons/9134.ru.html