Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Включение GL_POINT_SMOOTH


Автор: Ofer 18.1.2009, 19:35
Почему glEnable (GL_POINT_SMOOTH); не влияет на результат работы приложения? Или я не правильно понимаю смысл включения этого параметра: точки должны быть округлены...

Код

unit Unit1;

interface

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

type
  TfrmGL = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  private
    hrc: HGLRC;
  end;

var
  frmGL: TfrmGL;

implementation

{$R *.DFM}

{=======================================================================
Перерисовка окна}
procedure TfrmGL.FormPaint(Sender: TObject);
var
 i : 1..100;
begin
 wglMakeCurrent(Canvas.Handle, hrc);

 glViewPort (0, 0, ClientWidth, ClientHeight); // область вывода

 glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
 glClear (GL_COLOR_BUFFER_BIT);      // очистка буфера цвета

  glEnable (GL_POINT_SMOOTH);      // включаем режим сглаживания точек
 For i := 1 to 100 do begin
   glColor3f (random, random, random);  // текущий цвет примитивов
   glPointSize (random (20));           // размер точек
   glBegin (GL_POINTS);
     glVertex2f (random * 2 - 1, random * 2 - 1);
   glEnd;
 end;

 SwapBuffers(Canvas.Handle);         // содержимое буфера - на экран
 wglMakeCurrent(0, 0);
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
 SetDCPixelFormat(Canvas.Handle);
 hrc := wglCreateContext(Canvas.Handle);
end;

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

end.


Автор: Quartz 24.1.2009, 01:30
Этого недостаточно. Нужно включить альфа-тест и задать функцию смешивания.
Код
  glEnable( GL_BLEND );
  glEnable( GL_ALPHA_TEST );
  glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

Автор: Ofer 27.1.2009, 02:53
Эфект одинаковый. Не помогло :(

Автор: Quartz 27.1.2009, 12:17
Ofer, я проверяю решения перед тем, как публиковать их на форуме.

Код
 glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
 glClear (GL_COLOR_BUFFER_BIT);      // очистка буфера цвета
 glEnable( GL_BLEND );
 glEnable( GL_ALPHA_TEST );
 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
 glEnable (GL_POINT_SMOOTH);        // включаем режим сглаживания точек

user posted image

Автор: Ofer 28.1.2009, 00:38
Я понимаю, что проверяеш, но у меня не работает. Может у меня с настройками что не то. 
Quartz, выложи весь исходник, пожалуйста.

Добавлено через 13 минут и 34 секунды
Quartz, понял причину. Все дело в винде. На другой машине работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)