-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()函數中錯誤地翻譯了上。
getMVPMatrix()的實現在哪裏? – Axalo
_camera是使用模型視圖投影矩陣方法的Camera3D對象,而_hud是使用正投影方法的Camera2D對象。 3D相機正在工作,所以我沒有發佈該代碼。 –
您的HUD禁用了剔除功能,或者三角形肯定是正確的方式? –