Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
Неправильно рендерится сцена OpenGL
Здравствуйте.
Написал простую программу с использованием OpenGL.
Код:
VOID SetDCPixelFormat(HDC dc){
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
int n = ChoosePixelFormat(dc, &pfd);
SetPixelFormat(dc, n, &pfd);
return;
}
VOID glResizeWnd(int Width, int Height){
if (Width>0 && Height>0){
glViewport(0,0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective((GLdouble)45, (GLdouble)Width / (GLdouble)Height, (GLdouble)0.1, (GLdouble)100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
return;
}
VOID DrawBallBox(TBallBox bb){//рисуем куб из линий
glColor3f(bb.ColorR, bb.ColorG, bb.ColorB);
glBegin(GL_LINES);
// glColor3f(1,1,1);
// glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
// glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt1.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt1.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt1.Z);
glVertex3f(bb.Rect3D.pt2.X, bb.Rect3D.pt2.Y, bb.Rect3D.pt2.Z);
glEnd();
return;
}
VOID DrawCoordinatesNet(){//рисуем коордирнатную сетку
glColor3f(1,1,1);
glBegin(GL_LINES);
int s = 40;
for (int i = -s; i <= s; i++){
glVertex3f(i, -1, -s);
glVertex3f(i, -1, s);
}
for (int i = -s; i <= s; i++){
glVertex3f(-s, -1, i);
glVertex3f(s, -1, i);
}
glEnd();
return;
}
VOID RenderScene(){
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
SetCameraPos();
glPushMatrix();
DrawBallBox(BallBox);
DrawCoordinatesNet();
glBegin(GL_POINTS);
// glVertex3f((GLfloat)0.5,(GLfloat)0.5, (GLfloat)0);
glEnd();
glPopMatrix();
return;
}
VOID SetCameraPos(){
glLoadIdentity();
glRotatef(10,1,0,0);
glTranslatef(0,-6,-12);
return;
}
//функция главного окна
case WM_CREATE:{
PanRender = CreateWindow("Static", NULL,
WS_CHILD | WS_VISIBLE | SS_BITMAP, 0, 0, 90, 90,
wnd, NULL, MyInstance, NULL);
dcPanRender = GetDC(PanRender);
SetDCPixelFormat(dcPanRender);
hGLRC = wglCreateContext(dcPanRender);
wglMakeCurrent(dcPanRender, hGLRC);
glClearColor(0,0,0,0);
return 0;
}
case WM_SIZE:{
int w = LOWORD(lParam);
int h = HIWORD(lParam);
SetWindowPos(PanRender, 0, 0,0, w,h, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
glResizeWnd(w,h);
return 0;
}
Я хочу нарисовать координатную сетку, а потом нарисовать несколько точек в заранее определенных местах пространства. И при этом возникает странная проблема. Я не понимаю, из-за чего это происходит.
Проблема здесь:
Код:
glBegin(GL_POINTS);
glVertex3f((GLfloat)0.5,(GLfloat)0.5, (GLfloat)0);
glEnd();
DrawCoordinatesNet();
Если рисовать сначала точки, а потом координатную сетку, то всё нормально.
Картина выглядит вот так:
А если сначала рисовать координатную сетку, а потом точки:
Код:
DrawCoordinatesNet();
glBegin(GL_POINTS);
// glVertex3f((GLfloat)0.5,(GLfloat)0.5, (GLfloat)0);
glEnd();
причем сами точки можно даже не рисовать. То происходит что-то для меня непонятное и картина выглядит уже вот так:
Объясните, почему так и как это исправить?
Компилирую в GCC (MinGW) на windows 10 x64.
p.s. Аналогичный код в Delphi нормально работает. Только что проверял.
Последний раз редактировалось BLACK_RAIN; 16.11.2018 в 13:11.
|