Про OpenGl

Модератор: Модераторы

Сообщение badaninslava » 21.02.2006 00:28:30

У чусь прораммировать графику, но источники цвета у меня не работает.
Это переложение примера из Delphi.
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Сообщение badaninslava » 21.02.2006 00:31:49

Код на Delphi, который я попытался переложить:
Код: Выделить всё
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Menus,
 OpenGL;

type
 TfrmGL = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormPaint(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   procedure FormResize(Sender: TObject);
 private
   DC : HDC;
   hrc: HGLRC;
 end;

var
 frmGL: TfrmGL;

implementation

{$R *.DFM}

{=======================================================================
Перерисовка окна}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);      // очистка буфера цвета

 glBegin(GL_QUADS);
   glNormal3f(0.0, 0.0, 1.0);
   glVertex3f(1.0, 1.0, 1.0);
   glVertex3f(-1.0, 1.0, 1.0);
   glVertex3f(-1.0, -1.0, 1.0);
   glVertex3f(1.0, -1.0, 1.0);
 glEnd;

 glBegin(GL_QUADS);
   glNormal3f(-1.0, 0.0, 0.0);
   glVertex3f(-1.0, 1.0, 1.0);
   glVertex3f(-1.0, 1.0, -1.0);
   glVertex3f(-1.0, -1.0, -1.0);
   glVertex3f(-1.0, -1.0, 1.0);
 glEnd;

 glBegin(GL_QUADS);
   glNormal3f(0.0, 1.0, 0.0);
   glVertex3f(-1.0, 1.0, -1.0);
   glVertex3f(-1.0, 1.0, 1.0);
   glVertex3f(1.0, 1.0, 1.0);
   glVertex3f(1.0, 1.0, -1.0);
 glEnd;

SwapBuffers(DC);
end;

{=======================================================================
Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags  := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;

{=======================================================================
Создание формы}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
end;

{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close;
end;

procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 4, 10);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;

// этот фрагмент нужен для придания трёхмерности
glTranslatef(0.0, 0.0, -8.0);   // перенос объекта - ось Z
glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X
glRotatef(70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y

InvalidateRect(Handle, nil, False);
end;

end.
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Сообщение Feo » 21.02.2006 10:37:43

кроме построения нормалей, источник света нужно ещё установить. смотри у краснова или красной книге ;)
если ты имел ввиду не это, то glColor3f перед вывоом примитива...
Feo
 

Сообщение badaninslava » 21.02.2006 13:55:28

кроме построения нормалей, источник света нужно ещё установить. смотри у краснова или красной книге
если ты имел ввиду не это, то glColor3f перед вывоом примитива...

При освешении это надо делать перед выводом каждого примитава?
Можешь рабочий примерчик программы с освещением "на WinApi" (не для Lazarusa) скинуть?
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Сообщение badaninslava » 21.02.2006 13:56:57

Кто знает, посмотрите присоединённый файл(в начале), почему всё чёрным рисуется?
badaninslava
постоялец
 
Сообщения: 101
Зарегистрирован: 12.12.2005 01:21:44

Сообщение Feo » 21.02.2006 14:41:36

Код: Выделить всё
procedure CreateLight(x, z: Single);
const
 mat_specular   : array[0..3] of Single = (1.0, 1.0, 1.0, 1.0);
 mat_shininess  : Single = 50.0;
 white_light    : array[0..3] of Single = (1.0, 1.0, 1.0, 1.0);
var
 light_position : array[0..3] of Single;
begin
 light_position[0]:=x;
 light_position[0]:=15;
 light_position[0]:=z;
 light_position[0]:=0;
 glMaterialfv(GL_FRONT,GL_AMBIENT, @mat_specular);
 glMaterialfv(GL_FRONT,GL_SHININESS, @mat_shininess);
 glLightfv(GL_LIGHT0,GL_POSITION, @light_position);
 glLightfv(GL_LIGHT0,GL_DIFFUSE, @white_light);
 glLightfv(GL_LIGHT0,GL_SPECULAR, @white_light);
 glEnable(GL_LIGHTING);
 glEnable(GL_LIGHT0);
end;

это после инициализации огла установи
пс: дельфи 7
Feo
 


Вернуться в Графика

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru