Большой Воронежский Форум
» Программирование>Закраска Гуро
XFAN 16:02 30.04.2007
Тут такая проблема, нужно реализовать алгоритм закраски Гуро. Только не пойму даже с чего начать и с какой стороны к нему подойти.
Прочёл целых 3 книги по программированию графики на OpenGl и DirectX. Yandex и Google тоже не очень помогли.
Конкретно проблема в том, чтобы написать "свой"(полный) алгоритм Гуро вместо
glShadeModel (GL_SMOOTH) на opengl или вместо этого SetRenderState (D3DRS_SHADEMODE, D3DSHADE_GOURAUD) на DirectX, и потом использовать его при закрашивании объёмного многоугольника или другой подобной фигуры. По поводу слов "свой" алгоритм Гуро если кто не понял, то ни чего своего придумывать не надо просто нужно написать этот метод закраски по шагам алгоритма Гуро. Проблема в том что весь этот алгоритм с его шагами впихнули в библиотеку, из которой он вызывается(а точнее просто устанавливается метод закрашивания) вот так glShadeModel(GL_SMOOTH) и всё, а мне необходимо чтобы весь этот алгорим находился в моей программе.
Если кто-то может помоч, то киньте хоть маленький пример мне главное понять как потом этот написанный алгоритм применить при закраске фигур.
На каком языке на си или на делфи будет пример не важно
Заранее всем спасибо. [Ответ]
XFAN 16:13 30.04.2007
Вот небольшой пример есть в нем нужно только заменить
glShadeModel(GL_SMOOTH);
Алгоритмом Гуро, но я даже не пойму откуда начинать писать этот алгоритм и куда его вставлять
unit frmMain;
interface
uses
Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus, Controls,
Dialogs, OpenGL;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
DC: HDC;
hrc: HGLRC;
Quadric : GLUquadricObj;
procedure Init;
procedure SetDCPixelFormat;
protected
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
end;
var
frmGL: TfrmGL;
implementation
uses DGLUT;
{$R *.DFM}
procedure TfrmGL.Init;
const
light_position : Array [0..3] of GLfloat = ( 1.0, 1.0, 1.0, 0.0 );
begin
glLightfv(GL_LIGHT0, GL_POSITION, @light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
end;
procedure TfrmGL.WMPaint(var Msg: TWMPaint);
var
ps : TPaintStruct;
begin
BeginPaint(Handle, ps);
glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
glPushMatrix;
glRotatef (20.0, 1.0, 0.0, 0.0);
glPushMatrix;
glTranslatef (-0.75, 0.5, 0.0);
glRotatef (90.0, 1.0, 0.0, 0.0);
glutSolidTorus (0.275, 0.85, 20, 20);
glPopMatrix;
glPushMatrix;
glTranslatef (-0.75, -0.5, 0.0);
glRotatef (270.0, 1.0, 0.0, 0.0);
gluCylinder (Quadric, 1.0, 0.0, 2.0, 20, 20);
glPopMatrix;
glPushMatrix;
glTranslatef (0.75, 0.0, -1.0);
gluSphere (Quadric, 1.0, 20, 20);
glPopMatrix;
glPopMatrix;
SwapBuffers(DC);
EndPaint(Handle, ps);
end;
procedure TfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
Quadric := GLUNewQuadric;
Init;
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight );
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
If ClientWidth <= ClientHeight
then glOrtho (-2.5, 2.5, -2.5*ClientHeight/ClientWidth,
2.5*ClientHeight/ClientWidth, -10.0, 10.0)
else glOrtho (-2.5*ClientWidth/ClientHeight,
2.5*ClientWidth/ClientHeight, -2.5, 2.5, -10.0, 10.0);
glMatrixMode (GL_MODELVIEW);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
gluDeleteQuadric (Quadric);
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.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
end. [Ответ]
Timich 11:04 01.05.2007
Есть полностью прога на С++, в кот реализован алгоритмы Фонга, Гуро и еще какой-то... [Ответ]
XFAN 12:59 01.05.2007
Timich, Буду очень благодарен за такую прогу, дай ссылку пожалуйста где скачать, или на почту кинь. [Ответ]
Timich 13:36 01.05.2007
http://www.zk.ru/leonov/graph/index.htm
Удачи) [Ответ]
XFAN 14:07 01.05.2007
Спасибо Timich. [Ответ]
Вверх