簡體   English   中英

成功初始化后,OpenGL + SDL + glew無法繪制任何內容

[英]OpenGL + SDL + glew doesn't draw anything after successful initialization

所以一段時間以來,我一直在尋找解決方案,但是我所能找到的一切都已經過時了。 我的問題是,在初始化SDL並沒有任何錯誤的情況下,窗口會打開,並且除1、0或-1之外的其他Z上的任何內容都不會呈現。 而且將Z設置為這三個值中的任何一個都根本不起作用。 這是我的代碼。 我在頭文件中同時包含了glew和sdl,循環方法是主程序循環。

#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();
}

Z,1、0或-1以外的任何內容均不會渲染。

在OpenGL的規范化設備坐標系中, 查看體積只是沿着所有三個維度從-1到1的規范化立方體。

由於不應用任何變換,因此基本上可以直接在NDC空間中繪制(實際上,它是剪輯空間,但是如果輸入的w坐標均為1,則該空間將與NDC相同,並且默認情況下為NDC)。 結果,將z設置為<-1.0或> 1.0將導致頂點位於查看體積之外。 中間的任何值(不僅是0.0)都應該起作用。

而且將Z設置為這三個值中的任何一個都根本不起作用。

我不是100%肯定我正確地理解了這個問題。 我認為您希望將物件沿z移得越遠,物件的外觀就會越小。 但是,GL將始終通過在xy平面中進行簡單柵格化來始終進行正交(非透視)投影。 如果要獲得透視效果,則必須進行一些透視變換 ,通常是通過4x4均勻投影矩陣完成的。

我建議您先嘗試學習線性代數和同質空間/投影變換的基礎,然后再嘗試使用OpenGL或D3D等渲染API。

此外,您的代碼也存在一些問題:

您創建的背景下,這不會有任何影響(它只會告訴SDL做什么,下一次它創建一個GL上下文) 后,您請求GL上下文的版本。 您似乎還要求使用“現代” OpenGL版本3.3。 但是,現代GL中已棄用了用於繪圖的代碼,而核心配置文件中則完全刪除了這些功能。 如果您現在開始學習GL,我強烈建議您改為學習現代OpenGL,而不是20年前的過時知識。 看一下本教程 ,它還涉及數學的某些方面。

您沒有任何轉換矩陣。 因此,可見z的范圍是[-1,1]。 如果您指定其他值,則相應的部分將被剪切掉(並且將不可見)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM