@Sun_Serega, здравствуйте, недавно (в ноябре прошлого года:slight_smile:) начал учить OpenGL, а поскольку не знал других языков - на PascalABC.NET. На мой дилетантский взгляд, лучшая литература по OpenGL - Красная книга http://www.hardforum.ru/download/RedBook.pdf.
Так вот, в Вашей программе почему glEnable(GL_TEXTURE_2D); ? Когда должно быть 3D. Просто поменять “GL_TEXTURE_2D” на “GL_TEXTURE_3D” - не получится… потому что там нет этой константы, и многих функций для работы с текстурами тоже нет. Выход есть - взять из одноимённой библиотеки Делфи недостающее, и перекомпилировать библиотеку, но скажу честно, разобраться с текстурами так и не получилось:smiley:
2D-текстуры моделировать можно, рисуя поточечно загруженную картинку, но вряд ли Вы создаёте 2Dшную игру:slight_smile:
У меня, кстати, сохранились учебные программки, но они абсолютно некомментированы…
Вот небольшой пример. Нужно ещё создать форму, добавить на неё события и таймер, чтоб скомпилировать. А чтоб заработала, как надо, нужно рядом с программой положить две папки: “Гласные” и “Согласные”. Там должны быть файлы следующего содержания: “А.png” - с цветом буквы А, “Б.png” - с цветом буквы Б, и т.д., можно и всего одну букву кинуть, программа не сломается. Единственное, что она делает, по нажатию клавиши печатает кубик заданного цвета. Стрелки и NumLock для камеры, “!” и “@” - переключение режимов.
Unit Unit1;
{$reference System.Windows.Forms.dll}
{$reference System.Drawing.dll}
interface
uses System, System.Windows.Forms, OpenGL, System.IO, System.Drawing;
Const
R2 = 333;
D2 = 1;
type
Form1 = class(Form)
procedure Form1_Shown(sender: Object; e: EventArgs);
procedure Form1_KeyDown(sender: Object; e: KeyEventArgs);
procedure Рисование(sender: Object; e: EventArgs);
//procedure КолёсикоМыши(sender: Object; e: MouseEventArgs);
procedure Кубик(X,Y,Z:real);
Begin
glBegin(GL_Quads);
glVertex3f(0,Y,0);
glVertex3f(X,Y,0);
glVertex3f(X,Y,Z);
glVertex3f(0,Y,Z);
glVertex3f(X,Y,0);
glVertex3f(X,Y,Z);
glVertex3f(X,0,Z);
glVertex3f(X,0,0);
glVertex3f(0,Y,0);
glVertex3f(0,Y,Z);
glVertex3f(0,0,Z);
glVertex3f(0,0,0);
glVertex3f(0,Y,Z);
glVertex3f(X,Y,Z);
glVertex3f(X,0,Z);
glVertex3f(0,0,Z);
glVertex3f(0,Y,0);
glVertex3f(X,Y,0);
glVertex3f(X,0,0);
glVertex3f(0,0,0);
glVertex3f(0,0,0);
glVertex3f(X,0,0);
glVertex3f(X,0,Z);
glVertex3f(0,0,Z);
glEnd;
End;
{
Procedure КонтурКубика(X,Y,Z:real);
Begin{
X:=X+10;
Y:=Y+10;
Z:=Z+10;}{
Var R:real:=0;
glBegin(GL_Quads);
glVertex3f(R,Y,R);
glVertex3f(X,Y,R);
glVertex3f(X,Y,Z);
glVertex3f(R,Y,Z);
glVertex3f(X,Y,R);
glVertex3f(X,Y,Z);
glVertex3f(X,R,Z);
glVertex3f(X,R,R);
glVertex3f(R,Y,R);
glVertex3f(R,Y,Z);
glVertex3f(R,R,Z);
glVertex3f(R,R,R);
glVertex3f(R,Y,Z);
glVertex3f(X,Y,Z);
glVertex3f(X,R,Z);
glVertex3f(R,R,Z);
glVertex3f(R,Y,R);
glVertex3f(X,Y,R);
glVertex3f(X,R,R);
glVertex3f(R,R,R);
glVertex3f(R,R,R);
glVertex3f(X,R,R);
glVertex3f(X,R,Z);
glVertex3f(R,R,Z);
glEnd;
End;}
procedure Form1_KeyPress(sender: Object; e: KeyPressEventArgs);
procedure Form1_Load(sender: Object; e: EventArgs);
{$region FormDesigner}
private
{$resource Unit1.Form1.resources}
timer13: Timer;
components: System.ComponentModel.IContainer;
{$include Unit1.Form1.inc}
{$endregion FormDesigner}
public
АдресОкна:integer;
U1,U2,X0,Y0,Z0:real;
R:real:=-125;
Высота:real:=0;
X,Y,Z:real;
МассивОтрисовки:array[0..255,0..3] of byte;
n:Byte;
Режим:byte:=1;
C:array[char,0..3] of byte;
Диск:GLUquadricObj;
Радиус:real;
constructor;
begin
//self.MouseWheel+=КолёсикоМыши;
InitializeComponent;
АдресОкна:=GetDC(self.Handle.ToInt32);
OpenGLInit(self.Handle);
end;
procedure Сопоставление();
Begin
Var S:=System.IO.Directory.GetFiles(GetDir+'\Гласные');
Var Картинка:BitMap;
Var ARGB:Color;
Var Буква:char;
For var i:= 0 to S.Length -1 do
Begin
Картинка:=new Bitmap(S[i]);
Буква:=UpCase(ExtractFileName(S[i])[1]);
WriteLn(S[i],' ',Картинка.GetPixel(0,0));
ARGB:=Картинка.GetPixel(0,0);
C[Буква,0]:=ARGB.R;
C[Буква,1]:=ARGB.G;
C[Буква,2]:=ARGB.B;
C[Буква,3]:=100;
End;
S:=System.IO.Directory.GetFiles(GetDir+'\Согласные');
For var i:= 0 to S.Length -1 do
Begin
Картинка:=new Bitmap(S[i]);
Буква:=UpCase(ExtractFileName(S[i])[1]);
WriteLn(S[i],' ',Картинка.GetPixel(0,0));
ARGB:=Картинка.GetPixel(0,0);
C[Буква,0]:=ARGB.R;
C[Буква,1]:=ARGB.G;
C[Буква,2]:=ARGB.B;
C[Буква,3]:=50;
End;
End;
end;
implementation
{
procedure Form1.КолёсикоМыши(sender: Object; e: MouseEventArgs);
Var
D:=e.Delta / 120;
Begin
Высота+=D;
R+=D;
End;
}
procedure Form1.Form1_Shown(sender: Object; e: EventArgs);
begin
glViewPort(0,0,Width,Height);
glMatrixMode(GL_Projection);
glLoadIdentity;
gluPerspective(60,Width/Height,10,3000000);
glMatrixMode(GL_ModelView);
glClearColor(1,1,1,0);
glHint(GL_NICEST,GL_PERSPECTIVE_CORRECTION_HINT);
//glCullFace(GL_Back);
//glEnable(GL_Cull_Face);
glShadeModel(GL_Smooth);
glClearDepth(1.0);
glEnable(GL_Depth_Test);
glDepthFunc(GL_LEQUAL);
X:=50;
Y:=50;
Z:=50;
Y0:=Y/2;
U1:=90;
Диск:=gluNewQuadric();
gluQuadricDrawStyle(Диск,GLU_Fill);
gluQuadricNormals(Диск,GLU_SMOOTH);
end;
procedure Form1.Form1_KeyDown(sender: Object; e: KeyEventArgs);
begin
WriteLn(e.KeyData,' = ',e.KeyValue);
Case e.KeyValue of
8:
if n > 0 then
Begin
Begin
if МассивОтрисовки[n,3] <> 255 then
X0:=X0+МассивОтрисовки[n,3]
else X0:=X0+50
End;
n:=n-1
End;
32:
if n < 255 then
Begin
n:=n+1;
МассивОтрисовки[n,3]:=255;
X0:=X0-50;
End;
97:; //1
{98:
Begin
Z0-=10;
End;//2}
99:Y0-=10; //3
100:
Begin
X0+=10;
End;//4
101:; //5
102:
Begin
X0-=10;
End;//6
103:; //7
{104:
Begin
Z0+=10;
End;//8}
105:Y0+=10; //9
107:R+=25;
109:R-=25;
37:U2-=0.03;
38:U1-=0.03;
39:U2+=0.03;
40:U1+=0.03;
49:Режим:=1;
50:Режим:=2;
116:Сопоставление;
End;
end;
procedure Form1.Рисование(sender: Object; e: EventArgs);
begin
glClear(GL_Color_Buffer_Bit or GL_Depth_Buffer_Bit);
glLoadIdentity;
{
glBegin(GL_Lines);
glVertex3f(X0,Y0,Z0);
glVertex3f(X0,Y0+30,Z0);
glVertex3f(X0-30,Y0,Z0);
glVertex3f(X0+30,Y0,Z0);
glVertex3f(X0,Y0,Z0-30);
glVertex3f(X0,Y0,Z0+30);
glEnd;}
Case Режим of
1:
Begin
gluLookAt(+X0+R*Sin(U1)*Sin(U2),Y0+R*Cos(U1),Z0+R*Sin(U1)*Cos(U2),+X0,Y0,Z0,0,1,0);
if МассивОтрисовки[1,3] <> 255 then
Begin
glPolygonMode(GL_Front_and_Back,GL_Fill);
glColor3ubv(@МассивОтрисовки[1,0]);
Кубик(-МассивОтрисовки[1,3]*1.5,Y,Z);
{
glColor3f(0,0,0);
glPolygonMode(GL_Front_and_Back,GL_Line);
КонтурКубика(-(МассивОтрисовки[1,3])*1.5,Y,Z);
}
glTranslate(-(МассивОтрисовки[1,3])*1.5,0,0);
End
else
Begin{
glColor3f(0,0,0);
glPolygonMode(GL_Front_and_Back,GL_Line);
КонтурКубика(-75,Y,Z);
}
glTranslate(-75,0,0);
End;
For var i:= 2 to n do
Begin
if МассивОтрисовки[i,3] <> 255 then
Begin
glPolygonMode(GL_Front_and_Back,GL_Fill);
glColor3ubv(@МассивОтрисовки[i,0]);
Кубик(-МассивОтрисовки[i,3],Y,Z);
{
glColor3f(0,0,0);
glPolygonMode(GL_Front_and_Back,GL_Line);
КонтурКубика(-(МассивОтрисовки[i,3]),Y,Z);
}
glTranslate(-(МассивОтрисовки[i,3]),0,0);
End
else
Begin{
glColor3f(0,0,0);
glPolygonMode(GL_Front_and_Back,GL_Line);
КонтурКубика(-50,Y,Z);
}
glTranslate(-50,0,0);
End
End;
End;
2:
Begin
gluLookAt((R-Радиус)*Sin(U1-45)*Sin(U2),(R-Радиус)*Cos(U1-45),(R-Радиус)*Sin(U1-45)*Cos(U2),0,0,0,0,1,0);
Радиус:=0;
if МассивОтрисовки[1,3] <> 255 then
Begin
glColor3ubv(@МассивОтрисовки[1,0]);
gluDisk(Диск,0,МассивОтрисовки[1,3]*1.5,R2,D2);
Радиус:=Радиус+МассивОтрисовки[1,3]*1.5;
End
else Радиус:=Радиус+50;
For var i:= 2 to n do
Begin
if МассивОтрисовки[i,3] <> 255 then
Begin
glColor3ubv(@МассивОтрисовки[i,0]);
gluDisk(Диск,Радиус,Радиус+МассивОтрисовки[i][3],R2,D2);
Радиус:=Радиус+МассивОтрисовки[i][3];
End
else Радиус:=Радиус+50;
End;
End;
End;
SwapBuffers(АдресОкна);
end;
procedure Form1.Form1_KeyPress(sender: Object; e: KeyPressEventArgs);
begin
Var Буква:=UpCase(e.KeyChar);
//WriteLn(Буква,' = ',Ord(Буква));
if Ord(Буква)>32 then
if n < 255 then
if C[Буква,3]<>0 then
Begin
n:=n+1;
МассивОтрисовки[n,0]:=C[Буква,0];
МассивОтрисовки[n,1]:=C[Буква,1];
МассивОтрисовки[n,2]:=C[Буква,2];
МассивОтрисовки[n,3]:=C[Буква,3];
X0:=X0-C[Буква,3];
End
end;
procedure Form1.Form1_Load(sender: Object; e: EventArgs);
begin
Сопоставление();
end;
end.
Нельзя было проект целиком скинуть, т.к. новичок. Уже стало можно:
Цветной алфавит.rar (54,5 КБ)