2016-11-27 8 views
-1

, поэтому я искал решение для этого какое-то время, но все, что я мог найти, было довольно устаревшим. Моя проблема в том, что после инициализации SDL и glew без ошибок открывается окно, и что-либо на другом Z, чем 1, 0 или -1, не будет отображаться. А также установка Z в любое из этих трех значений ничего не делает. Вот мой код. У меня есть как glew, так и sdl, включенные в заголовок, а метод цикла - основной программный цикл.OpenGL + SDL + glew ничего не рисует после успешной инициализации

#include "Controller.h" 

int Controller::loop() { 
    // Initialize 
    if(!init()) 
     return -1; 

    SDL_Event _event; 

    // Main loop 
    while(_running) { 
     // Loop through all input 
     while(SDL_PollEvent(&_event)) 
      event(_event); 
     // Game logic 
     step(); 
     // Game drawing 
     draw(); 
    } 

    // End game 
    end(); 
    return 0; 
} 

bool Controller::init() { 
    // Initialize SDL 
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0) 
     return false; 

    // Create window 
    if ((_mainWindow = SDL_CreateWindow("GAME", 200, 200, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL)) == NULL) 
     return false; 

    // Create context 
    _mainContext = SDL_GL_CreateContext(_mainWindow); 

    // Make it active 
    SDL_GL_MakeCurrent(_mainWindow, _mainContext); 

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); 

    // Initialize glew 
    glewExperimental = GL_TRUE; 
    if (glewInit() != 0) 
     return false; 

    return true; 
} 

void Controller::event(SDL_Event& _event) { 
    switch(_event.type) { 
    case SDL_KEYDOWN: 
     switch (_event.key.keysym.sym) { 
     case SDLK_ESCAPE: 
      _running = false; 
      break; 
     default: 
      std::cout << "Key has been pressed." << std::endl; 
     } 
    default: 
     break; 
    } 
    _world[_currentWorld].event(_event); 
} 

void Controller::step() { 
    _world[_currentWorld].step(); 
} 

void Controller::draw() { 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3f(1.0f, 0.0f, 0.0f); 

    glBegin(GL_TRIANGLES); 

    glVertex3f(-1.0f, -0.5f, -4.0f); // A 
    glVertex3f(1.0f, -0.5f, -4.0f); // B 
    glVertex3f(0.0f, 0.5f, -4.0f); // C 

    glEnd(); 

    //_world[_currentWorld].draw(); 
    SDL_GL_SwapWindow(_mainWindow); 
} 

void Controller::end() { 
    SDL_GL_DeleteContext(_mainContext); 
    SDL_DestroyWindow(_mainWindow); 
    SDL_Quit(); 
} 

ответ

2

ничего на другом Z, чем 1, 0 или -1, не будет отображаться.

В нормализованном устройстве OpenGL в системе координат, объем просмотра только нормированный куб происходит от -1 до 1 по всем трем измерениям.

Поскольку вы не применяете никаких преобразований, вы в основном прямо рисуете пространство NDC (на самом деле это будет пространство клипов, но оно будет идентично NDC, если ваш вход w координаты равен 1 каждый, и по умолчанию). В результате установка z на < -1.0 или> 1.0 приведет к тому, что вершины будут расположены вне объема просмотра. Однако любые значения между ними (а не только 0.0) должны работать.

А также установка Z в любое из этих трех значений ничего не делает.

Я не уверен на 100%, что я правильно понял этот вопрос. Я думаю, вы ожидаете, что объекты будут казаться меньшими, чем дальше вы их перемещаете вдоль z. Но GL будет всегда делать ортогональную (не перспективную) проекцию, просто растеризуя в плоскости xy. Вы должны сделать какое-то изменение трансформации, если вам нужен эффект перспективы, и, как правило, это делается с помощью однородной матрицы проекции 4x4.

Сначала я бы посоветовал вам сначала изучить основы линейной алгебры и гомогенных пространств/проективных преобразований, прежде чем пытаться погрузиться в API-интерфейсы визуализации, такие как OpenGL или D3D.

Кроме того, есть несколько проблем с вашим кодом:

запрашивается GL контекст версии после вы создали контекст, который не будет иметь никакого эффекта (это будет только сказать SDL, что делать в следующий раз он создает контекст GL). Вы также, кажется, запрашиваете «современную» версию OpenGL, 3.3. Тем не менее, код, который вы используете для рисования, устарел в современном GL, и эти функции полностью удалены в профилях ядра. Если вы начнете изучать GL в наши дни, я настоятельно рекомендую изучить современный OpenGL вместо этого, а не этот устаревший рывок с 20 лет назад. Взгляните на this tutorial, в нем также рассматриваются некоторые аспекты математики.

+0

Спасибо за ответ. Я собрал этот код из нескольких учебников, и ни один из них не нашел все, что мне нужно было знать. Я полностью забыл о том, что атрибут Z имеет диапазон от 0 до 1. Я не хотел вдаваться в трансформацию, прежде чем смог нарисовать простой треугольник. А также весь урок, который я нашел, был этот старый рисунок стиля. –

1

У вас нет матриц преобразования. Следовательно, диапазон видимых z равен [-1, 1]. Если вы укажете значения из этого, соответствующие части будут отсечены (и не будут видны).