![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Линия и цвет OpenGl [Delphi, Windows]
zzet © (2003-12-08 16:21:00)Не могу окрасить линию в красный цвет. Делаю так:
procedure TfrmMain.Init;
{Здесь происходит подготовка списков, текстур,
вызов glColor НИГДЕ не происходит}
glNewList (lin, GL_COMPILE);
glPushAttrib(GL_CURRENT_BIT);
glPushMatrix;
glTranslatef(50.0, 50.0, 151.5);
glLineWidth (5);
glEnable(GL_LINE_SMOOTH);
glBegin (GL_LINES);
glNormal3f(0.0, 0.0, 1.0);
glColor3f (1.0, 0.0, 0.0); // - вызов здесь, но НИЧЕГО не окрашивается.
glVertex(-1.665, 0.03);
glVertex(1.63, 0.03);
glEnd;
glDisable(GL_LINE_SMOOTH);
glPopMatrix;
glPopAttrib;
glEndList;
end;
procedure TfrmMain.WMPaint(var Msg: TWMPaint);
{ Здесь рисуется сцена}
if line1 then glCallList(lin); // - линия рисуется серым цветом.
end;
Вызов glColor3f; есть только при подготовке списка линии, больше нигде не используется. Линия все равно не красится. В чем дело?
Darthman (2003-12-09 10:29:00) [1]hexone:
хехе... бес попутал, что-то у меня каша после выходных в голове была... действительно, ведь можно ;)
zzet (2003-12-09 10:02:00) [2]>hexone © (09.12.03 09:37) [6]
Спасибо, попробую.
hexone (2003-12-09 09:37:00) [3]
> Darthman © (08.12.03 16:42) [1]
> glColor3f нельзя использовать в операторных скобках glBegin
> GlEnd;
Можно. Как же тогда vertex color делать.
Ты применил освещение, материал и текстуру на линию. Текстура наложена без смешивания с основным цветом. Отключи текстуру, освещение и нарисуй линию. Потом включи опять.
zzet (2003-12-08 20:12:00) [4]Вот вроде так:
procedure TfrmMain.Init;
const
light_diffuse : Array [0..3] of GLfloat = (1.0, 1.0, 1.0, 0.0);
light_specular : Array [0..3] of GLfloat = (1.0, 1.0, 1.0, 0.0);
mat_specular : Array [0..3] of GLfloat = (1.0, 1.0, 1.0, 1.0);
lmodel_ambient : Array [0..3] of GLfloat = (0.0, 0.0, 0.0, 0.0);
mat_shininess : GLfloat = 50.0;
begin
glEnable(GL_DEPTH_TEST);
glLightfv(GL_LIGHT0, GL_DIFFUSE, @light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, @light_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, @mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, @mat_shininess);
glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glNewList (fon, GL_COMPILE);
glEnable(GL_TEXTURE_2D);
PrepareImage ('IntFase.bmp');
glBegin(GL_QUADS);
glNormal3f(0.0,0.0,1.0);
glTexCoord2f(0.0,0.0);
glVertex3f(0.0,0.0,0.0);
glTexCoord2f(1.0,0.0);
glVertex3f(100.0,0.0,0.0);
glTexCoord2f(1.0,1.0);
glVertex3f(100.0,100.0,0.0);
glTexCoord2f(0.0,1.0);
glVertex3f(0.0,100.0,0.0);
glEnd;
glDisable(GL_TEXTURE_2D);
glEndList;
glNewList (bar1, GL_COMPILE);
glEnable(GL_TEXTURE_2D);
gluQuadricTexture (quadObj, TRUE);
PrepareImage ('sprit.bmp');
glEndList;
glNewList (lin1, GL_COMPILE);
glPushAttrib(GL_CURRENT_BIT);
glPushMatrix;
glColor3f (1.0, 0.0, 0.0);
glTranslatef(50.0, 50.0, 151.5);
glLineWidth (5);
glEnable(GL_LINE_SMOOTH);
glBegin (GL_LINES);
glNormal3f(0.0, 0.0, 1.0);
glVertex(-1.665, 0.03);
glVertex(1.63, 0.03);
glEnd;
glDisable(GL_LINE_SMOOTH);
glPopMatrix;
glPopAttrib;
glEndList;
PrepareImage ('logo.bmp');
end;
procedure TfrmMain.WMPaint(var Msg: TWMPaint);
var
ps : TPaintStruct;
begin
BeginPaint(Handle, ps);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
glOrtho(-50.0, 50.0, -50.0, 50.0, 200.0, 300.0);
glMatrixMode(GL_MODELVIEW);
// без записи в буфер глубины
glDepthMask(FALSE);
glEnable(GL_TEXTURE_2D);
if logo then begin glCallList(logot);
glDisable(GL_TEXTURE_2D); glDepthMask(TRUE);
glMatrixMode(GL_PROJECTION); glPopMatrix; glMatrixMode(GL_MODELVIEW);
end
else begin glCallList(fon);
glDisable(GL_TEXTURE_2D); glDepthMask(TRUE);
glMatrixMode(GL_PROJECTION); glPopMatrix; glMatrixMode(GL_MODELVIEW);
glCallList(bar1);
glPushMatrix;
glTranslatef(48.34, dist, 150.0);
glRotatef(Angle1, 0.0, 0.0, 1.0);
gluCylinder (quadObj, rad, rad, 0.653, 50, 10);
glPopMatrix;
glPushMatrix;
glTranslatef(50.952, dist, 150.0);
glRotatef(90, 0.0, 1.0, 0.0);
glRotatef(Angle5, 0.0, 0.0, 1.0);
gluCylinder (quadObj, rad, rad, 0.653, 50, 10);
glPopMatrix;
if line1 then glCallList(lin1);
SwapBuffers(DC);
EndPaint(Handle, ps);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmMain.FormResize(Sender: TObject);
begin
clientheight:=round(clientwidth/aspect);
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0, 1.0, -1.0, 1.0, 50.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(-50.0, -50.0, -250.0);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
quadObj := gluNewQuadric;
Init;
end;
procedure TfrmMain.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;
procedure TfrmMain.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_F5 then line1 := false;
end;
end.
zzet (2003-12-08 19:02:00) [5]код длинный, щас попробую пообрезать.
Darthman (2003-12-08 18:22:00) [6]полный код программы, если можно.
zzet (2003-12-08 18:10:00) [7]>Darthman © (08.12.03 16:42) [1]
пробовал и так:
glNewList (lin, GL_COMPILE);
glPushAttrib(GL_CURRENT_BIT);
glPushMatrix;
glTranslatef(50.0, 50.0, 151.5);
glColor3f (1.0, 0.0, 0.0);
glLineWidth (5);
glEnable(GL_LINE_SMOOTH);
glBegin (GL_LINES);
glNormal3f(0.0, 0.0, 1.0);
glVertex(-1.665, 0.03);
glVertex(1.63, 0.03);
glEnd;
glDisable(GL_LINE_SMOOTH);
glPopMatrix;
glPopAttrib;
glEndList;
все равно не получается..
Darthman (2003-12-08 16:42:00) [8]glColor3f нельзя использовать в операторных скобках glBegin GlEnd;