顶点未显示
Verticies aren't showing
我的代码有问题。没有任何错误,但没有绘制任何内容。我不知道发生了什么事。我做错了什么?
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()
查询)
相关文章:
- 如何循环打印顶点结构
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- Opengl 以 2D 或 3D 显示顶点
- 仅显示 OpenGL 最近的顶点绘制
- OpenGL代码显示人体图形,从二进制文件中读取顶点
- OpenGL顶点缓冲区对象未显示
- 顶点未显示
- C++程序在试图显示一个顶点从数据文件中读取的三角形时会冻结
- 当尝试通过OpenGL渲染顶点缓冲对象时,屏幕上没有显示任何内容