Как раз пытаюсь писать по книге Open GL суперкнига - нашел ее в сети. ) К сожалению там не описано как зафиксировать источник света. Читал и уроки NeHe и RedBook там про это как- то не очень понятно написано. В какое бы место кода я не вставлял строчки GLfloat lightpos[] = {-200.0f,200.0f,300.0f,1.0f}; glLightfv(GL_LIGHT0,GL_POSITION,lightpos); источник света вращается вместе со сценой.
Должны быть три координатных оси графера. Сфера в центре просто для проверки освещения. Точек на графике может быть в пределе 860 000 - каждая объект типа сфера. То есть по любому придется при трансформациях их все перерисовывать в цикле ?
И еще столкнулся с тем, что иногда создается неокрашенная панель - как-будто программа не получает hDc. При этом никаких сообщений не возникает.
Код в общем такой:
bool TForm1::OpenGLInit() { if((hDC = GetDC(Panel1->Handle)) == NULL) return false; SetGLPixelFormat(hDC); if((hRC = wglCreateContext(hDC)) == NULL) return false; if(!wglMakeCurrent(hDC, hRC)) return false;
GLfloat diffuselight[] = {0.7f,0.7f,0.7f,1.0f}; GLfloat ambientlight[] = {0.3f,0.3f,0.3f,1.0f};
glLightfv(GL_LIGHT0,GL_AMBIENT,ambientlight); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuselight);
GLfloat lightpos[] = {-200.0f,200.0f,300.0f,1.0f}; glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glColor3f(0.0f,1.0f,0.0f);
glEnable(GL_DEPTH_TEST);
return true; } //--------------------------------------------------------------------------- void TForm1::SetGLPixelFormat(HDC hdc) { int PixelFormatIndex; PIXELFORMATDESCRIPTOR PixelFormat = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; PixelFormatIndex = ChoosePixelFormat(hdc, &PixelFormat); SetPixelFormat(hdc, PixelFormatIndex, &PixelFormat); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { if(!OpenGLInit()) ShowMessage("..."); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormPaint(TObject *Sender) { PaintScene(); } //--------------------------------------------------------------------------- void TForm1::ShowAxe() { glShadeModel(GL_FLAT); glFrontFace(GL_CW);
quadObj = gluNewQuadric (); gluQuadricNormals(quadObj, GLU_SMOOTH); gluQuadricDrawStyle(quadObj, GLU_FILL);
glPushMatrix();
glRotatef(90, 0.0f, 1.0f, 0.0f); gluCylinder(quadObj,1,1, 200, 32, 32); glTranslatef(0.0f,0.0f,200.0f); glColor3f(0.0f,0.0f,1.0f); gluCylinder(quadObj,4,0, 30, 32, 32); glColor3f(0.0f,0.5f,0.1f); gluDisk(quadObj,0.0f,4.0f,32,32); glPopMatrix(); } //--------------------------------------------------------------------------- void TForm1::PaintScene() { glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
ShowAxe(); glLoadIdentity(); glRotatef(-90,0,1,0); ShowAxe(); glLoadIdentity(); glRotatef(90,0,0,1); ShowAxe();
glColor3f(1.0f,0.0f,1.0f); gluSphere (quadObj, 30, 16, 16);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
SwapBuffers(hDC); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormResize(TObject *Sender) { SetSize(); } //--------------------------------------------------------------------------- void TForm1::SetSize() { float nRange = (Panel1->Width < Panel1->Height)?Panel1->Width/2:Panel1->Height/2; w = Panel1->Width; h = Panel1->Height; if(h == 0) h = 1; glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
if(w <= h) glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -500, 500); else glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -500, 500); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { wglMakeCurrent (NULL, NULL) ; wglDeleteContext(hRC); ReleaseDC(Handle,hDC); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { glMatrixMode(GL_PROJECTION);
if(Key == VK_LEFT) glRotatef(-5, 0.0f, 1.0f, 0.0f); else if(Key == VK_RIGHT) glRotatef(5, 0.0f, 0.1f, 0.0f); else if(Key == VK_UP) glRotatef(5, 1.0f, 0.0f, 0.0f); else if(Key == VK_DOWN) glRotatef(-5, 1.0f, 0.0f, 0.0f);
PaintScene(); }
|