Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает glClear(...), OpenGL 
V
    Опции темы
1122
  Дата 4.12.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: нет
Всего: нет



По заданию в лабе нужно вывести на экран три фигуры в пространстве, а затем установить режим проверки буфера глубины и вывести опять эти три фигуры.
Есть следующий код:

Код

 GLvoid DrawGLScene(GLvoid)
{
    //glClear(GL_COLOR_BUFFER_BIT);
       switch(index)
       {
       case 1://полигон
               glClear(GL_COLOR_BUFFER_BIT);
               glColor3f(1.0, 0.0, 0.0);
               glBegin(GL_TRIANGLES);
               glVertex3f(0.0,0.3,0.2);
               glVertex3f(0.3,0.3,0.0);
               glVertex3f(0.0,0.0,0.7);
               glEnd; 

                glColor3f(0.0, 0.0, 1.0);
                glBegin(GL_TRIANGLES);
                glVertex3f(0.0,0.0,0.3);
                glVertex3f(0.4,0.0,0.5);
                glVertex3f(-0.5,0.5,-1.0);
                glEnd;

               break;
       case 2:
             
               glEnable(GL_DEPTH_TEST);
               glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
               glColor3f(1.0, 1.0, 0.4);
               glBegin(GL_TRIANGLES);
               glVertex3f(0.0,0.3,0.2);
               glVertex3f(0.3,0.3,0.0);
               glVertex3f(0.0,0.0,0.7);
               glEnd; 

                glColor3f(0.2, 0.2, 1.0);
                glBegin(GL_TRIANGLES);
                glVertex3f(0.0,0.0,0.3);
                glVertex3f(0.4,0.0,0.5);
                glVertex3f(-0.5,0.5,-1.0);
                glEnd;
               break;
       case 3:
                glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
                glColor3f(0.4, 0.2, 0.4);
                glBegin(GL_TRIANGLES);
                glVertex3f(0.0,0.0,0.3);
                glVertex3f(0.4,0.0,0.5);
                glVertex3f(-0.5,0.5,-1.0);
                glEnd;
               break;
       default:
               index = 1;
               break;
       }
}


1. Изображение постоянно мелькает,как будто часто обновляется цвета. 
2. При переключении с одного кейса на другой старое экран не очищается. Почему и как это исправить?
PM MAIL   Вверх
Rickert
Дата 5.12.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Этого кода мало. Как меняется index? Где вызывается функция. Желательно весь код в студию.
Почему у вас glEnd без скобок? Должно быть glEnd();


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Alexeis
Дата 5.12.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



мерцания бывают от того что не отключено сообщение WM_ERASEBKG, в результате чего винда рисует фон серым цветом. 
Цитата(1122 @  4.12.2009,  22:07 Найти цитируемый пост)
При переключении с одного кейса на другой старое экран не очищается

  Кто вызывает функцию отрисовки?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
1122
Дата 5.12.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: нет
Всего: нет



Код целиком:

Код

#include <cstdlib>
#include <cstdlib>
#include <math.h>
#include <windows.h>        // Заголовочный файл для Windows
#include <gl\gl.h>        // Заголовочный файл для OpenGL32 библиотеки
#include <gl\glu.h>        // Заголовочный файл для GLu32 библиотеки
#include <gl\glaux.h>        // Заголовочный файл для GLaux библиотеки


static HGLRC hRC;               // Постоянный контекст рендеринга
static HDC hDC;                 // Приватный контекст устройства GDI


int index = 1;

BOOL    keys[256];              // Массив для процедуры обработки клавиатуры

GLvoid InitGL(GLsizei Width, GLsizei Height)    //Вызвать после создания окна GL
{
       glClearColor(0.0f, 0.0f, 0.0f, 0.0f);           // Очистка экрана в черный цвет
}

GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
{
       if (Height==0)          // Предотвращение деления на ноль,
                               //если окно слишком мало
               Height=1;
       glViewport(0, 0, Width, Height);
               // Сброс текущей области вывода и перспективных преобразований
}

GLvoid DrawGLScene(GLvoid)
{
    //glClear(GL_COLOR_BUFFER_BIT);
       switch(index)
       {
       case 1://полигон
               glClear(GL_COLOR_BUFFER_BIT);
               glColor3f(1.0, 0.0, 0.0);
               glBegin(GL_TRIANGLES);
               glVertex3f(0.0,0.3,0.2);
               glVertex3f(0.3,0.3,0.0);
               glVertex3f(0.0,0.0,0.7);
               glEnd;

               glColor3f(0.0, 1.0, 0.0);
                glBegin(GL_QUADS);
                glVertex3f(-0.5,0.5,0.3);
                glVertex3f(-0.5,-0.5,0.3);
                glVertex3f(0.5,-0.5,0.3);
                glVertex3f(0.5,0.5,0.3);
                glEnd; 

                glColor3f(0.0, 0.0, 1.0);
                glBegin(GL_TRIANGLES);
                glVertex3f(0.0,0.0,0.3);
                glVertex3f(0.4,0.0,0.5);
                glVertex3f(-0.5,0.5,-1.0);
                glEnd;

               break;
       case 2:
             
               glEnable(GL_DEPTH_TEST);
               glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
               glColor3f(1.0, 1.0, 0.4);
               glBegin(GL_TRIANGLES);
               glVertex3f(0.0,0.3,0.2);
               glVertex3f(0.3,0.3,0.0);
               glVertex3f(0.0,0.0,0.7);
               glEnd;

               glColor3f(0.4, 1.0, 0.4);
                glBegin(GL_QUADS);
                glVertex3f(-0.5,0.5,0.3);
                glVertex3f(-0.5,-0.5,0.3);
                glVertex3f(0.5,-0.5,0.3);
                glVertex3f(0.5,0.5,0.3);
                glEnd; 

                glColor3f(0.2, 0.2, 1.0);
                glBegin(GL_TRIANGLES);
                glVertex3f(0.0,0.0,0.3);
                glVertex3f(0.4,0.0,0.5);
                glVertex3f(-0.5,0.5,-1.0);
                glEnd;
               break;
       case 3://треугольники
                glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
                glColor3f(0.4, 0.2, 0.4);
                glBegin(GL_TRIANGLES);
                glVertex3f(0.0,0.0,0.3);
                glVertex3f(0.4,0.0,0.5);
                glVertex3f(-0.5,0.5,-1.0);
                glEnd;
               break;

       default:
               index = 1;
               break;
       }
}

 LRESULT CALLBACK WndProc(    HWND    hWnd,
                UINT    message,
                WPARAM    wParam,
                LPARAM    lParam)
  {
    RECT    Screen;        // используется позднее для размеров окна
    GLuint    PixelFormat;
    static    PIXELFORMATDESCRIPTOR pfd=
    {
        sizeof(PIXELFORMATDESCRIPTOR),    // Размер этой структуры
    1,                // Номер версии (?)
      PFD_DRAW_TO_WINDOW |        // Формат для Окна
    PFD_SUPPORT_OPENGL |        // Формат для OpenGL
    PFD_DOUBLEBUFFER,        // Формат для двойного буфера
    PFD_TYPE_RGBA,        // Требуется RGBA формат
    16,                // Выбор 16 бит глубины цвета
    0, 0, 0, 0, 0, 0,        // Игнорирование цветовых битов (?)
    0,                // нет буфера прозрачности
    0,                // Сдвиговый бит игнорируется (?)
    0,                // Нет буфера аккумуляции
    0, 0, 0, 0,            // Биты аккумуляции игнорируются (?)
    16,                // 16 битный Z-буфер (буфер глубины)
    0,                // Нет буфера траффарета
    0,                // Нет вспомогательных буферов (?)
    PFD_MAIN_PLANE,        // Главный слой рисования
    0,                // Резерв (?)
    0, 0, 0            // Маски слоя игнорируются (?)
    };
      switch (message)    // Тип сообщения
    {
    case WM_CREATE:
        hDC = GetDC(hWnd);    // Получить контекст устройства для окна
        PixelFormat = ChoosePixelFormat(hDC, &pfd);
            // Найти ближайшее совпадение для нашего формата пикселов
  if (!PixelFormat)
        {
            MessageBox(0,"Can't Find A SuitablePixelFormat.","Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            // Это сообщение говорит, что программа должна завершиться
            break;    // Предтовращение повтора кода
        }
   if(!SetPixelFormat(hDC,PixelFormat,&pfd))
        {
            MessageBox(0,"Can't Set ThePixelFormat.","Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }
  hRC = wglCreateContext(hDC);
    if(!hRC)
        {
    MessageBox(0,
                 "Can't Create A GLRenderingContext.",
                 "Error",MB_OK|MB_ICONERROR);
        PostQuitMessage(0);
        break;
        }
    if(!wglMakeCurrent(hDC, hRC))
        {
        MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
        PostQuitMessage(0);
        break;
        }
      GetClientRect(hWnd, &Screen);
        InitGL(Screen.right, Screen.bottom);
        break;
    case WM_DESTROY:
        case WM_CLOSE:
        ChangeDisplaySettings(NULL, 0);

        wglMakeCurrent(hDC,NULL);
        wglDeleteContext(hRC);
        ReleaseDC(hWnd,hDC);
                PostQuitMessage(0);
                break;
    case WM_KEYDOWN:
        keys[wParam] = TRUE;
        break;

    case WM_KEYUP:
        keys[wParam] = FALSE;
        break;
    case WM_SIZE:
        ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
        break;
 default:
    return (DefWindowProc(hWnd, message, wParam, lParam));
    }
    return (0);
}
 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                LPSTR lpCmdLine,int nCmdShow)
{
    MSG        msg;    // Структура сообщения Windows
    WNDCLASS    wc;   // Структура класса Windows для установки типа окна
    HWND        hWnd;    // Сохранение дескриптора окна
      wc.style        = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc    = (WNDPROC) WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance    = hInstance;
    wc.hIcon        = NULL;
    wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    = NULL;
    wc.lpszMenuName    = NULL;
    wc.lpszClassName    = "OpenGL WinClass";
       if(!RegisterClass(&wc))
    {
    MessageBox(0,
"Failed To Register The WindowClass.",
"Error",MB_OK|MB_ICONERROR);
    return FALSE;
    }
 hWnd = CreateWindow("OpenGL WinClass",
               "First OpenGL program",    // Заголовок вверху окна

    WS_POPUP |
    WS_CLIPCHILDREN |
    WS_CLIPSIBLINGS,
      0, 0,            // Позиция окна на экране
    1024,768,        // Ширина и высота окна
      NULL,
    NULL,
    hInstance,
    NULL);
  if(!hWnd)
    {
    MessageBox(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR);
        return FALSE;
    }
 if(!hWnd)
    {
    MessageBox(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR);
        return FALSE;
    }

ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
    SetFocus(hWnd);
 while (1)
    {        // Обработка всех сообщений
        while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            if (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                return TRUE;
            }
        }



               DrawGLScene();                          // Нарисовать сцену
       SwapBuffers(hDC);                       // Переключить буфер экрана
       if (keys[VK_ESCAPE]) SendMessage(hWnd,WM_CLOSE,0,0);
                       // Если ESC - выйти
       if (keys[0x31]) index = 1;
       if (keys[0x32]) index = 2;
       if (keys[0x33]) index = 3;
       if (keys[0x34]) index = 4;
       if (keys[0x35]) index = 5;
       if (keys[0x36]) index = 6;
       if (keys[0x37]) index = 7;
       }
}

PM MAIL   Вверх
Rickert
Дата 6.12.2009, 13:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Как я уже и говорил, проблема в том что у вас отсутствуют скобки после glEnd. Поставьте их - и всё пройдёт.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
1122
Дата 6.12.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 24.10.2007

Репутация: нет
Всего: нет



Спасибо!!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.