顶点未显示

Verticies aren't showing

本文关键字:显示 顶点      更新时间:2023-10-16

我的代码有问题。没有任何错误,但没有绘制任何内容。我不知道发生了什么事。我做错了什么?

Main.cpp

//
//  MainGame.cpp
//
#include "MainGame.hpp"
#include <iostream>
#include <string>
#include "Errors.hpp"
// Constructor, initialize private variables
MainGame::MainGame() {
    _window = nullptr;
    _screenWidth = 1080;
    _screenHeight = 720;
    _gameState =  GameState::PLAY;
}

MainGame::~MainGame() {
    SDL_DestroyWindow(_window);
    SDL_Quit();
}
// Run the game
void MainGame::run() {
    initSystem();
    _sprite.init(-1.0f, -1.0f, 1.0f, 1.0f);
    gameLoop();
}
// Initialize SDL2, OpenGL, and whatever else
void MainGame::initSystem() {
    if (0 != SDL_Init(SDL_INIT_EVERYTHING)) {
        fprintf(stderr, "nUnable to initalize SDL: %sn", SDL_GetError());
        fatalError("Unable to initiaize SDL");
    }
    SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    // Create the window...
    _window = SDL_CreateWindow("My Game",
                               SDL_WINDOWPOS_CENTERED,
                               SDL_WINDOWPOS_CENTERED,
                               _screenWidth,
                               _screenHeight,
                               SDL_WINDOW_OPENGL |
                               SDL_WINDOW_SHOWN  |
                               SDL_WINDOW_RESIZABLE);
    if (_window == nullptr) {
        fatalError("Window could not be created");
    }
    SDL_GLContext glContext = SDL_GL_CreateContext(_window);
    if (glContext == nullptr) {
        fatalError("SDL_GL context could not be created!");
    }
    // Clear to black
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    initShaders();
}
void MainGame::initShaders() {
    _colorProgram.compileShaders("/Shaders/colorShader.vert", "/Shaders/colorShader.frag");
    _colorProgram.addAttribute("vertexPosition");
    _colorProgram.linkShaders();
}
void MainGame::gameLoop() {
    while (_gameState != GameState::EXIT) {
        processInput();
        drawGame();
    }
}
// Process input with SDL2
void MainGame::processInput() {
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
        switch (event.type) {
            case SDL_QUIT:
                _gameState = GameState::EXIT;
                break;
            case SDL_APP_DIDENTERFOREGROUND:
                SDL_Log("SDL_APP_DIDENTERFOREGROUND");
                break;
            case SDL_APP_DIDENTERBACKGROUND:
                SDL_Log("SDL_APP_DIDENTERBACKGROUND");
                break;
            case SDL_APP_LOWMEMORY:
                SDL_Log("SDL_APP_LOWMEMORY");
                break;
        }
    }
}
void MainGame::drawGame() {
    glClearDepth(1.0f);
    //glClearColor(rand() % 255 / 255.0f, rand() % 255 / 255.0f, rand() % 255 / 255.0f, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    _colorProgram.use();
    // Draw sprite
    _sprite.draw();
    _colorProgram.unuse();
    SDL_GL_SwapWindow(_window);
}

精灵.cpp

//
//  Sprite.cpp
//

#include "Sprite.hpp"
Sprite::Sprite() : _vboID(0) {
}
Sprite::~Sprite() {
    if (_vboID != 0) {
        glDeleteBuffers(1, &_vboID);
    }
}
void Sprite::init(float x, float y, float width, float height) {
    // Setup private vars
    _x = x;
    _y = y;
    _width = width;
    _height = height;
    if (_vboID == 0) {
        glGenBuffers(1, &_vboID);
    }
    float vertexData[12];
    // First triangle
    vertexData[0] = x + width;
    vertexData[1] = x + height;
    vertexData[2] = x;
    vertexData[3] = y + height;
    vertexData[4] = x;
    vertexData[5] = y;
    // Second triangle
    vertexData[6] = x;
    vertexData[7] = y;
    vertexData[8] = x + width;
    vertexData[9] = y;
    vertexData[10] = x + width;
    vertexData[11] = y + height;
    // Bind vertex buffer object
    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    // Upload to GPU
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    // Unbind
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void Sprite::draw() {
    // Bind buffer
    glBindBuffer(GL_ARRAY_BUFFER, _vboID);
    // Use first attribute array
    glEnableVertexAttribArray(0);
    // Point data to VBO
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
    // Draw 6 verticies to screen
    glDrawArrays(GL_TRIANGLES, 0, 6);
    // Disable vertex attribute array
    glDisableVertexAttribArray(0);
    // Unbind VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

在OpenGL>3.3 Core Profile中,必须使用VAO。

通常,这会在draw命令上给您一个GL_INVALID_OPERATION错误(必须由glGetError()查询)