Новичок
Профиль
Группа: Участник
Сообщений: 38
Регистрация: 7.5.2008
Репутация: нет Всего: нет
|
Написал небольшой редактор, когда рисую объекты, например, с помощью ф-ции auxSolidSphere, то цвет меняется с серого на белый:   здесь часть кода: | Код | //--------------------------------------------------------------------------- //----- COpenGL ------------------------------------------------------------- //--------------------------------------------------------------------------- COpenGL::COpenGL(NWndStyle AStyle) : CCanvas(AStyle) { M1.Set(0, 0); M2.Set(App->Screen->GetWidth(), App->Screen->GetHeight());
Create(); // CreateWnd(); Paint_Create(); } void SetupLighting() { GLfloat MaterialAmbient[] = {0.5, 0.5, 0.5, 1.0}; GLfloat MaterialDiffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloat MaterialSpecular[] = {1.0, 1.0, 1.0, 1.0}; GLfloat MaterialShininess[] = {50.0}; GLfloat AmbientLightPosition[] = {-10.0, 10.0, -10.0, 0.0}; GLfloat LightAmbient[] = {0.5, 0.5, 0.5, 0};
glMaterialfv(GL_FRONT, GL_AMBIENT, MaterialAmbient); glMaterialfv(GL_FRONT, GL_DIFFUSE, MaterialDiffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, MaterialSpecular); glMaterialfv(GL_FRONT, GL_SHININESS, MaterialShininess); glLightfv(GL_LIGHT0, GL_POSITION, AmbientLightPosition); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, LightAmbient);
glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glShadeModel(GL_SMOOTH); } bool COpenGL::Paint_Create() { hdc = GetDC(hwnd);
PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.cDepthBits = 32; int N = ChoosePixelFormat(hdc, &pfd); SetPixelFormat (hdc, N, &pfd); hrc = wglCreateContext(hdc); wglMakeCurrent(hdc, hrc);
// glEnable(GL_DEPTH_TEST); // glEnable(GL_CULL_FACE); SetupLighting();
glViewport(0, 0, W1Const, H1Const); glPushMatrix(); glScaled(2.0 / (W1Const), 2.0 / (H1Const), ZScale); glRotated(-90, 0, 0, 1); glTranslated(HConst / 2 - GetHeight() + Koef, -WConst / 2, ZTrans); // gluOrtho2D(0, 0, 800, 600); return true; } bool COpenGL::Paint_Rechange() { glPopMatrix(); glPushMatrix(); glScaled(2.0 / (W1Const), 2.0 / (H1Const), ZScale); glRotated(-90, 0, 0, 1); glTranslated(HConst / 2 - GetHeight() + Koef, -WConst / 2, ZTrans); return true; } bool COpenGL::Paint_Begin() { Paint_Rechange(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); return true; } bool COpenGL::Paint_End() { glFlush(); SwapBuffers(hdc); return true; } bool COpenGL::Paint_Destroy() { glPopMatrix(); wglMakeCurrent(NULL, NULL); ReleaseDC(hwnd, hdc); return true; } void COpenGL::SetColor(CColor C) { CCanvas::SetColor(C); } void COpenGL::SetColor(real R, real G, real B) { CCanvas::SetColor(R, G, B); glColor3f(R, G, B); }
void COpenGL::Pen_Line(CRect R) { real X1 = R.M1.X; real Y1 = R.M1.Y; real X2 = R.M2.X; real Y2 = R.M2.Y;
glBegin(GL_LINES); glVertex2f (X1, Y1); glVertex2f (X2, Y2); glEnd(); glBegin(GL_POINTS); glVertex2f (X2, Y2); glEnd(); } void COpenGL::Pen_Rectangle(CRect R) { real X1 = R.M1.X; real Y1 = R.M1.Y; real X2 = R.M2.X; real Y2 = R.M2.Y;
// glEdgeFlag(true);
Pen_Line(CRect(X1, Y1, X2, Y1, false)); Pen_Line(CRect(X2, Y1, X2, Y2, false)); Pen_Line(CRect(X2, Y2, X1, Y2, false)); Pen_Line(CRect(X1, Y2, X1, Y1, false)); }
void COpenGL::Pen_Ellipse(CRect R) { real X1 = R.M1.X; real Y1 = R.M1.Y; real X2 = R.M2.X; real Y2 = R.M2.Y; real Two = 2; real XMid = Round((X1 + X2) / Two); real YMid = Round((Y1 + Y2) / Two); real RX = XMid - X1; real RY = YMid - Y1; glBegin(GL_LINE_LOOP); real TwoPI(2 * M_PI); real Step(M_PI / 64); for (real i = 0; i < TwoPI; i += Step) { real X = XMid + cosl(i) * RX; real Y = YMid + sinl(i) * RY; glVertex2f(X, Y); } glEnd(); } void COpenGL::Pen_SetStyle(int value) { Pen_Style = value; if (Pen_Style != 0) { glEnable(GL_LINE_STIPPLE); if (Pen_Style == 1) glLineStipple(1, 0x0f0f); if (Pen_Style == 2) glLineStipple(1, 0x5555); } else { glDisable(GL_LINE_STIPPLE); glLineStipple(1, 0xffff); } } void COpenGL::Brush_Rectangle(CRect R) { CRect r = R; r.ChangeRect(0, 0, 1, 1); glBegin(GL_QUADS); glVertex2f(r.M1.X, r.M1.Y); glVertex2f(r.M2.X, r.M1.Y); glVertex2f(r.M2.X, r.M2.Y); glVertex2f(r.M1.X, r.M2.Y); glEnd(); } void COpenGL::Brush_Ellipse(CRect R) { real X1 = R.M1.X; real Y1 = R.M1.Y; real X2 = R.M2.X; real Y2 = R.M2.Y; real XMid = Round((X1 + X2) / 2); real YMid = Round((Y1 + Y2) / 2); real RX = XMid - X1; real RY = YMid - Y1; real TwoPI(2 * M_PI); real Step(M_PI / 32); glBegin(GL_POLYGON); for (real i = 0; i < TwoPI; i += Step) { real X = XMid + cosl(i) * RX; real Y = YMid + sinl(i) * RY; glVertex2f(X, Y); } glEnd(); } void COpenGL::Cube(CRect R) { // Pen_Rectangle(R); real X = R.M1.X; real Y = R.M1.Y; real W = R.GetWidth(); real H = R.GetHeight(); glPushMatrix(); glTranslated(Y + H / 2, X + W / 2, 0); glScaled(H, W, 1); glRotated(90, 0, 0, 1);
glRotated(45, 45, 45, 1); auxSolidCube(0.6); glPopMatrix(); } void COpenGL::Sphere(CRect R) { real X = R.M1.X; real Y = R.M1.Y; real W = R.GetWidth(); real H = R.GetHeight(); glPushMatrix(); glTranslated(Y + H / 2, X + W / 2, 0); glScaled(H, W, 1); glRotated(90, 0, 0, 1);
// glRotated(45, 45, 45, 1); auxSolidSphere(0.5); glPopMatrix(); } void COpenGL::Teapot(CRect R) { real X = R.M1.X; real Y = R.M1.Y; real W = R.GetWidth(); real H = R.GetHeight(); glPushMatrix(); glTranslated(Y + H / 2, X + W / 2, 0); glScaled(H, W, 1); glRotated(90, 0, 0, 1);
// glRotated(45, 45, 45, 1); auxSolidTeapot(0.3); glPopMatrix(); }
|
В чём может быть проблема?
|