Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2018, 12:49   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 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.
BLACK_RAIN вне форума Ответить с цитированием
Старый 17.11.2018, 09:07   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

А если разворачивать камеру по оси Х, то получается лютая наркомания:
Код:
    glLoadIdentity();
    glRotatef(40, 0,1,0);

    glPushMatrix();
    DrawCoordinatesNet();
    glBegin(GL_POINTS);
//    glVertex3f((GLfloat)0.5,(GLfloat)0.5, (GLfloat)0);
    glEnd();
    glPopMatrix();

Да, я знаю. Разворачивается и двигается не камера, а весь мир. Но сути это не меняет. Это выглядит так, как будто я грибов наелся и косяк раскурил.

Последний раз редактировалось BLACK_RAIN; 17.11.2018 в 09:12.
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.11.2018, 14:46   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

del

Последний раз редактировалось BLACK_RAIN; 29.11.2018 в 14:50.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL неправильно работает glutReshapeFunc WolfMan96 Помощь студентам 0 27.06.2015 18:48
Qt+OpenGL. Qt "не видит" функции OpenGL EnterFix Qt и кроссплатформенное программирование С/С++ 4 29.01.2013 18:59
Сцена в Unity У кого запускается? MaratZahidyl Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 06.12.2011 07:41
m3g сцена из 3дМакса Pliks Общие вопросы по Java, Java SE, Kotlin 1 06.04.2010 14:10
Че неправильно! HixoH Общие вопросы C/C++ 0 23.12.2009 15:04