2015-05-20 131 views
-1

我正在創建3D迷宮遊戲並試圖繪製HUD。我使用的是OpenGL,GLSL和C++。我在繪製迷宮,切換到正交投影,然後繪製HUD(當前是測試三角形)。世界渲染正常工作,但HUD沒有渲染任何東西。Opengl在3D遊戲中繪製HUD

我在概念上誤解了一些東西,不確定在哪裏尋找我的錯誤。

我的HUD使用2D相機類:

class Camera2D 
{ 
public: 
    Camera2D(); 
    ~Camera2D(); 

    void init(int screenWidth, int screenHeight); 
    void update(); 
    void draw(); 

    void setPosition(glm::vec2& newPosition){ _position = newPosition; _needsMatrixUpdate = true; }; 

    glm::mat4 getCameraMatrix() { return _cameraMatrix; }; 

private: 
    GLuint _vbo; 
    GLuint _vao; 

    int _screenWidth, _screenHeight; 
    bool _needsMatrixUpdate; 

    glm::vec2 _position; 
    glm::mat4 _cameraMatrix; 
    glm::mat4 _orthoMatrix; 
}; 

在功能的實現是

void Camera2D::init(int screenWidth, int screenHeight) 
{ 
    _screenWidth = screenWidth; 
    _screenHeight = screenHeight; 
    _orthoMatrix = glm::ortho(0.0f, (float)_screenWidth, 0.0f, (float)_screenHeight); 
} 

void Camera2D::update() 
{ 
    if (_needsMatrixUpdate) 
    { 
     //Camera Translation 
     glm::vec3 translate(-_position.x + _screenWidth/2, -_position.y + _screenHeight/2, 0.0f); 
     _cameraMatrix = glm::translate(_orthoMatrix, translate); 

     _needsMatrixUpdate = false; 
    } 
} 

void Camera2D::draw() 
{ 

    float _points[] = { 0, 0, 0, 0, 5, 0, 5, 0, 0 }; 
    float _colors[] = { 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1 }; 

    if (_vbo == 0) 
    { 
     glGenBuffers(1, &_vbo); 
    } 
    glBindBuffer(GL_ARRAY_BUFFER, _vbo); 

    glBufferData(GL_ARRAY_BUFFER, sizeof(_points) + sizeof(_colors), nullptr, GL_STATIC_DRAW); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(_points), _points); 
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(_points), sizeof(_colors), _colors); 

    if (_vao == 0) 
    { 
     glGenVertexArrays(1, &_vao); 
    } 
    glBindVertexArray(_vao); 

    glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); 
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)(sizeof(_points))); 

    glDrawArrays(GL_TRIANGLES, 0, 9); 
} 

在MainGame.cpp我初始化HUD和設置它的位置。

void MainGame::initSystems() 
{ 
    GameEngine3D::init(); 
    _window.create("Maze Runner", _screenWidth, _screenHeight); 

    glEnable(GL_CULL_FACE); 
    glFrontFace(GL_CCW); 
    glCullFace(GL_BACK); 

    initShaders(); 

    //Trap mouse within window 
    //If SDL_SetRelativeMouseMode fails exit game 
    if (SDL_SetRelativeMouseMode(SDL_TRUE)) 
    { 
     _gameState = GameState::EXIT; 
    } 

    _hud.init(_screenWidth, _screenHeight); 
    _hud.setPosition(glm::vec2(_screenWidth/2, _screenHeight/2)); 

    //Generate Maze 
    mazeAlgor.generateMazeWeights(); 
    mazeAlgor.generateMaze(); 
    mazeAlgor.printMaze(); 
} 

更新它在遊戲循環

void MainGame::gameLoop() 
{ 
    while (_gameState != GameState::EXIT) 
    { 
     processInput(); 

     //update the camera model-view-projection matrix 
     _camera.Update(); 
     _hud.update(); 

     draw(); 
    } 
} 

最後得出它」

void MainGame::draw() 
{ 
    glClearDepth(1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    _shaderProgram.use(); 

    //locate the location of "MVP" in the shader 
    GLint mvpLocation = _shaderProgram.getUniformLocation("MVP"); 

    //pass the camera matrix to the shader 
    glm::mat4 cameraMatrix = _camera.getMVPMatrix(); 
    glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, &(cameraMatrix[0][0])); 

    mazeAlgor.drawMaze(); 

    glm::mat4 projMatrix = _hud.getCameraMatrix(); 
    glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, &(projMatrix[0][0])); 

    _hud.draw(); 

    _shaderProgram.unuse(); 

    _window.swapBuffer(); 
} 

我的頂點着色器是這樣的:

in vec4 vertexPosition; 
in vec4 vertexColor; 

out vec4 fragmentColor; 

uniform mat4 MVP; 

void main() 
{ 
    gl_Position = MVP * vertexPosition; 
    fragmentColor = vertexColor; 
} 

我有一種感覺,我在update()函數中錯誤地翻譯了上。

+0

getMVPMatrix()的實現在哪裏? – Axalo

+0

_camera是使用模型視圖投影矩陣方法的Camera3D對象,而_hud是使用正投影方法的Camera2D對象。 3D相機正在工作,所以我沒有發佈該代碼。 –

+0

您的HUD禁用了剔除功能,或者三角形肯定是正確的方式? –

回答

0

有在你的代碼兩次失誤可能導致的問題:

  • glm::mat4 projMatrix = _hud.getCameraMatrix();
    getCameraMatrix()不返回你的投影矩陣

  • glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, &(projMatrix[0][0]));
    你分配你的「投影矩陣「到您的模型視圖投影矩陣(MVP)

固定的代碼看起來是這樣的:

glm::mat4 modelviewMatrix = _hud.getCameraMatrix(); // _hud._cameraMatrix 
glm::mat4 projMatrix = _hud.getProjectionMatrix(); // _hud._orthoMatrix 
glm::mat4 mvp = projMatrix * modelviewMatrix; 
glUniformMatrix4fv(mvpLocation, 1, GL_FALSE, glm::value_ptr(mvp)); 

我也建議你閱讀thisthis