2016-03-28 15 views
0

Hallo Alles, ich versuche, eine Modellklasse in opengl zu erstellen und eine Instanz der Modellklasse in einem Spiel zu erstellen. Ich kann nur ein Objekt rendern und das zweite Objekt wird nicht gerendert.Erstellen einer Modellklasse in OpenGl

Ich hatte das gleiche Problem, wenn alles in der gleichen Klasse war. Ich habe einen separaten VBO und VAO für bot die Objekte und die Probleme wurde gelöst.

Jetzt versuche ich, eine Klasse daraus zu erstellen, und jetzt habe ich das gleiche Problem. Da es sich um eine Klasse handelt, sind VAO und VBO nicht getrennt angelegt ??

Meine Modellklasse und Spielklasse sind wie folgt.

#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); 

} 

Und hier ist das Spiel Klasse

#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(); 

} 

Hier ist der Ausgang. Nur die Box zeigt und der Boden nicht.

enter image description here

+0

Es gibt keine Klassen in diesem Code. –

+0

Ich habe nur die .cpp-Dateien und nicht die Header eingefügt. –

Antwort

1

Sie haben Uniformen Shader-Pass, in der Draw-Aufruf nicht in einem Update. Weil du deinen Shader in Draw aktivierst.

prüfen dieses Beispiel http://in2gpu.com/2015/06/04/drawing-a-cube/

+0

Danke. Das war genau das Problem. Ich habe Sergiu eine Nachricht geschickt, um herauszufinden, um was es sich handelt. Für einzelne Modelle verwende ich uniforms in update und es hat funktioniert. Ich habe mich an die gleiche Logik gewöhnt und es ist ziemlich schief gegangen. Vielen Dank. :) –

+0

Ja, ich bin es Sergiu: D – CrSe

Verwandte Themen