����, ������ ����� ��� ��� ����������
����� � �������, ��� � ����������� �������� �������. ��� ����� ��������� ������ ������ � ���������� � Delphi - OpenGL.
��������, ��������� ����� ������� ������� ���� �� � �������� ����� ����, � ������� �� ������������� ������ ���� ������������ ������.
��� �� �����, ��� ��� ���������� �� ������ � ����������������� OpenGL � Delphi, � �� ������������ �������� ������� ��� ������:
http://www.delphisources.ru/pages/faq/base..._beginners.html
http://www.delphisources.ru/pages/faq/base...beginners2.html
����, ������.
���
uses
OpenGL, Jpeg;
...
var
Bm: TBitmap;
TxBits: array [0..255,0..255,0..2] of Glubyte;
TexObj : Array [0..10] of GLUint;
��������� ������ ��� ��������� OpenGL;
���
procedure glGenTextures (n: GLsizei; textures: PGLuint); stdcall; external opengl32;
procedure glBindTexture (target: GLEnum; texture: GLuint); stdcall; external opengl32;
procedure glTexSubImage2D (target: GLEnum; level, xoffset, yoffset: GLint; width, height: GLsizei; format,
atype: GLEnum; pixels: Pointer); stdcall; external opengl32;
procedure glDeleteTextures (n: GLsizei; textures: PGLuint); stdcall; external opengl32;
� ������ ���������� ��� ����� ��������:
���
procedure LoadBMPTexture(file_name: string);
var
i,j: integer;
begin
Bm:= TBitmap.Create;
Bm.LoadFromFile(file_name);
For i:= 0 to 255 do
For j:= 0 to 255 do begin
TxBits[j,i,0]:= GetRValue(Bm.Canvas.Pixels[i,j]);
TxBits[j,i,1]:= GetGValue(Bm.Canvas.Pixels[i,j]);
TxBits[j,i,2]:= GetBValue(Bm.Canvas.Pixels[i,j]);
end;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
256, 256, // texture size
0, GL_RGB, GL_UNSIGNED_BYTE, @TxBits);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
Bm.Free;
end;
procedure LoadJPGTexture(file_name: string);
var
i,j: integer;
JpegIm: TJpegImage;
begin
Bm:= TBitmap.Create;
JpegIm:= TJpegImage.Create;
JpegIm.LoadFromFile(file_name);
Bm.Assign(JpegIm);
For i:= 0 to 255 do
For j:= 0 to 255 do begin
TxBits[j,i,0]:= GetRValue(Bm.Canvas.Pixels[i,j]);
TxBits[j,i,1]:= GetGValue(Bm.Canvas.Pixels[i,j]);
TxBits[j,i,2]:= GetBValue(Bm.Canvas.Pixels[i,j]);
end;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
256, 256, // texture size
0, GL_RGB, GL_UNSIGNED_BYTE, @TxBits);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
Bm.Free;
JpegIm.Free;
end;
procedure LoadTextures;
var
a: integer;
fl: TStringList;
texfileext: string;
begin
fl:= TStringList.Create;
fl.LoadFromFile('texturesfiles.txt');
// ��������� ������ ������ �������
if (fl.Count
//* generate texture object IDs */
glGenTextures( 10, @TexObj );
a:= 0;
while (a
// ���������� ����� ������ � ������
begin
texfileext:= Copy(fl.Strings[a],Length(fl.Strings[a]) - 2,3);
// �������, ��� �� ���� ��� ������� - jpg ��� ���.
If (texfileext = 'jpg') then
begin
LoadJPGTexture(fl.Strings[a]);
end
else begin
LoadBMPTexture(fl.Strings[a]);
end;
//* setup first texture object */
glBindTexture( GL_TEXTURE_2D, TexObj[a] );
a:= a + 1;
end;
fl.Free;
end;
������ � FormCreate ���������� �������
���
LoadTextures;
� �������� ����� ��������� � ������ ���������� ��� ������ ���������������� ���������.
� ���� ������� � ����������� ������ �� 10 ������� �������� 256 � 256. ��� ������� ��� ����� �������� - ����� ������� ������ ���������, ���������� ����������� �� ��� LoadTextures, ��������� ��� ������� �� �� ��� ��� ����� � �� �������� �������� ������ ������� TexObj.
��� �������� ������� �������. ��� ��� ��� ��� �� ����, ������ �� ������� ����� ���� ���� �����-���� �������� ������. �.�. �������� 2,4,8,16,32,64,128,256 � �.�. ��� ��� �������� �������� 1024 � 256 ����� ���� ���������, � 1000 � 300 - ���.
�� ����� ���� ������� ���������� ������� �������� ������� ������ �������, �� �� ������ �� ������� �� �����, ��� ������� ����� ������.
����, � ���� ������� � ����������� ������������ ������ ������� 256 � 256. ��� ������������ ��������
���
TxBits: array [0..255,0..255,0..2] of Glubyte;
��� ������, ��������� LoadBMPTexture ���������� ���, ��� ��������������� ��������� ���� ������ � ����� �������� ������ � ������ ����������.
LoadJPGTexture ���������� ��� �� �����, ������ ����������� ������ �� jpg �����.
� ���, ���� ��������� - ������ ������ ��� �������� ������� �� ���������� ����� texturesfiles.txt
��� ��� �� � ����� ����������? ����������� ����������� - �������� - ����������� � ������ ����������, ��� ���� ������ �������� ������������� ����� - ����� �����. � ������ ������ ��� ���������� � ��� �� �������, � ������� ���� �������� � ������, ������� � 0.
������, ����� ������� �����-���� �������� �� ������ ���������� � ���������� �� �� ���-������, ��� ����������� ����� ������ �� �����.
��������� ��������� ������ ��������� �������������� ��������� �������� ���������, � 2� � 3�.
���
procedure TexturedQuad(x,y,h,w,tid: integer);
// ��������� ����������������� �������������� � 2�
// x,y - ����������: h,w - �������: tid - ����� �������� ������� ����� ������������
begin
glEnable(GL_TEXTURE_2D);
if HaveTexObj
then glBindTexture( GL_TEXTURE_2D, TexObj[tid] )
else glCallList( TexObj[tid] );
glBegin(GL_QUADS);
glTexCoord2f(0,1); glVertex2f(x,y);
glTexCoord2f(0,0); glVertex2f(x,y+h);
glTexCoord2f(1,0); glVertex2f(x+w,y+h);
glTexCoord2f(1,1); glVertex2f(x+w,y);
glEnd;
glDisable(GL_TEXTURE_2D);
end;
procedure TexturedQuad3d(p: T3dPoint; h,w,tid: integer);
// ��������� �������� ����������������� �������������� � 3�.
// p - ���������� � 3�, ��������� ��� �������
begin
glEnable(GL_TEXTURE_2D);
if HaveTexObj
then glBindTexture( GL_TEXTURE_2D, TexObj[tid] )
else glCallList( TexObj[tid] );
glBegin(GL_QUADS);
glTexCoord2f(0,1); glVertex3f(p.X,p.Y,p.Z);
glTexCoord2f(0,0); glVertex3f(p.x,p.Y+h,p.z);
glTexCoord2f(1,0); glVertex3f(p.x+w,p.y+h,p.z);
glTexCoord2f(1,1); glVertex3f(p.x+w,p.Y,p.z);
glEnd;
glDisable(GL_TEXTURE_2D);
end;
procedure TexCube(x,y,z,xs,ys,zs: extended; tid: integer);
// ��������� ������, ��������� ���������. � 3�.
// x,y,z - ����������; xs,ys,zs - ������� ������; tid - ����� ��������
begin
glShadeModel(GL_FLAT);
glEnable(GL_TEXTURE_2D);
if HaveTexObj
then glBindTexture( GL_TEXTURE_2D, TexObj[tid] )
else glCallList( TexObj[tid] );
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glBegin(GL_QUAD_STRIP);
glTexCoord2f(0,0); glVertex3f(x,y,z);
glTexCoord2f(0.5,0); glVertex3f(x,y,z + zs);
glTexCoord2f(0,0.25); glVertex3f(x,y + ys,z);
glTexCoord2f(0.5,0.25); glVertex3f(x,y + ys,z + zs);
glTexCoord2f(0,0.5); glVertex3f(x + xs,y + ys,z);
glTexCoord2f(0.5,0.5); glVertex3f(x + xs,y + ys,z + zs);
glTexCoord2f(0,0.75); glVertex3f(x + xs,y,z);
glTexCoord2f(0.5,0.75); glVertex3f(x + xs,y,z + zs);
glTexCoord2f(0,1); glVertex3f(x,y,z);
glTexCoord2f(0.5,1); glVertex3f(x,y,z + zs);
glEnd;
glBegin(GL_QUADS);
glTexCoord2f(0.5,0); glVertex3f(x,y,z);
glTexCoord2f(1,0); glVertex3f(x + xs,y,z);
glTexCoord2f(1,0.5); glVertex3f(x + xs, y + ys,z);
glTexCoord2f(0.5,0.5); glVertex3f(x,y + ys,z);
glTexCoord2f(0.5,0.5); glVertex3f(x,y,z + zs);
glTexCoord2f(1,0.5); glVertex3f(x + xs,y,z + zs);
glTexCoord2f(1,1); glVertex3f(x + xs, y + ys,z + zs);
glTexCoord2f(0.5,1); glVertex3f(x,y + ys,z + zs);
glEnd;
glDisable(GL_TEXTURE_2D);
end;
�, �������, ����� �������� ��� ����� T3DPoint. ��� ��� ������ ������� � ��������� ��� ������� ��������� � 3�.
���
type
T3DPoint = record
X: extended;
Y: extended;
Z: extended;
end;
� ��������, ����������� ��������� �������� �����. glTexCoord2f ������ ���������� ���������� ��� �������, ������� ����� ���������� ������.
������� ������ glVertex2f � 2� � glVertex3f � 3�. ��� ��� ��� �������� ����� �������� � �������, �� ������� � ����� ������ � ������. ��������� ��� ����� � ���� ��� ����� �� ������.
��� ��������� ��������� Draw � ������� �������, ��������� � ��� �� �������. ������� � ��� ������ ���� ��������, ����� ���-�� ����������.
��������
���
procedure Draw;
begin
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
TexCube(0,0,0,10,10,10,2);
SwapBuffers(ghDC);
end;
�������� ����� �������� 10�10�10 � ������ ���������, ��� ��������� ����� ������������ �������� ��� ������� 2.
���������� ����� ��������, ��� ��� �������� ���� �������� ������������ ��������� �����������. �������� ��������, ����������� � ���� ������� �� ��������, ��������� �� ��������������� ������� ����. ���������� �������� ������������� ����� � ������������ �� ����� �� 4 ���������� �������. ����� ��� ����� ������ ������� �������� �������.
�� ����, ���� ���. �������, �������������� ������� - ��������������.