Про OpenGl

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

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

Сообщение badaninslava »

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

Сообщение badaninslava »

Код на 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.
Feo

Сообщение Feo »

кроме построения нормалей, источник света нужно ещё установить. смотри у краснова или красной книге ;)
если ты имел ввиду не это, то glColor3f перед вывоом примитива...
badaninslava
постоялец
Сообщения: 101
Зарегистрирован: 12.12.2005 00:21:44

Сообщение badaninslava »

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

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

Сообщение badaninslava »

Кто знает, посмотрите присоединённый файл(в начале), почему всё чёрным рисуется?
Feo

Сообщение Feo »

Код: Выделить всё

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
Ответить