c++ - 在 OpenGl 中创建模型类

标签 c++ opengl

大家好我正在尝试在 opengl 中创建模型类并在游戏中创建模型类的实例。我只能渲染一个对象而第二个对象不渲染。

当所有这些都在同一个类(class)时,我遇到了同样的问题。我为对象创建了一个单独的 VBO 和 VAO,问题就解决了。

现在我正在尝试从中创建一个类,现在我面临着同样的问题。因为它是一个类,所以不是单独创建的 VAO 和 VBO 吗??

我的模型类和游戏类如下。

#include "FlatModel.h"

#include "Camera.h"

GLfloat vertices[] = {

//position              
-0.5f, -0.5f, 0.0f,   
-0.5f, 0.5f, 0.0f,   
0.5f, 0.5f, 0.0f,     
0.5f, -0.5f, 0.0f    
};

GLuint indices[] = {
// front
0, 1, 2,
0, 2, 3
};


 FlatModel::FlatModel(Camera* _camera, glm::vec3 color) {

camera = _camera;
objectColor = color;

ShaderLoader *shaderLoader = 0;
program = shaderLoader->CreateProgram("shaders/FlatModel.vs","shaders/FlatModel.fs");

glEnable(GL_DEPTH_TEST);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices),  indices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}

FlatModel::~FlatModel() {
}

void FlatModel::update(GLfloat time) {

GLint currentTimeLocation = glGetUniformLocation(program, "currentTime");
glUniform1f(currentTimeLocation, time);

GLint objectColorLoc = glGetUniformLocation(program, "objectColor");
glUniform3f(objectColorLoc, objectColor.x, objectColor.y, objectColor.z);

glm::mat4 mvp = camera->getprojectionMatrix() * camera->getViewMatrix() * model;
GLint mvpLoc = glGetUniformLocation(program, "mvp");
glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, glm::value_ptr(mvp));
}


 void FlatModel::render() {

glUseProgram(this->program);
glBindVertexArray(vao);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);

}

这是游戏类

#include "Game.h"

void Game::GameInit(){

camera = new Camera(45.0f, WIDTH, HEIGHT, 0.1f, 100.0f);
camera->setCameraSpeed(0.05f);

ground = new FlatModel(camera, glm::vec3(1.0f, 1.0f, 0.5f));
ground->setScale(glm::vec3(3.0f, 0.5f, 1.0f));
ground->setPosition(glm::vec3(0.0f, -0.5f, 0.0f));

box = new FlatModel(camera, glm::vec3(1.0f, 0.0f, 0.0f));
box->setScale(glm::vec3(1.0f, 0.5f, 1.0f));
box->setPosition(glm::vec3(0.0f, 0.5f, 0.0f));
}

void Game::GameUpdate(){

camera->update();

GLfloat currentTime = glutGet(GLUT_ELAPSED_TIME);
currentTime = currentTime / 1000;

ground->update(currentTime);
box->update(currentTime);
}

void Game::GameDraw(){

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

ground->render();
box->render();

}

这是输出。只有盒子显示,地面没有显示。

enter image description here

最佳答案

您必须将制服传递给着色器,在绘制调用中而不是在更新中。因为您在 Draw 中激活了着色器。

检查这个例子 http://in2gpu.com/2015/06/04/drawing-a-cube/

关于c++ - 在 OpenGl 中创建模型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256561/

相关文章:

C++ pow() 函数在放入函数时会改变行为

c++ - 对 OpenGL 中着色器的行为感到困惑 - 切换声明会导致错误和崩溃

language-agnostic - opengl如何将3d点投影到屏幕空间?

java lwjgl 在当前线程中找不到 OpenGL 上下文

c++ - 指向特定的继承

c++ - 字符串输入大于 1000 个字符时执行挂起

c++ - 带有类和 DLL 的外部 "C"

c++ - Printf() - 打印字符限制

macos - 在 OSX 上将项目升级到 OpenGL 4.1 - 使用 NSOpenGLProfileVersion4_1Core 会使渲染变慢

c++ - 我的 VBO 有问题