OpenGL

2016-03-28 5 views
0

Merhaba ben opengl bir model sınıf oluşturmak ve bir oyunda modeli sınıfının bir örneğini oluşturmaya çalışıyorum tüm bir model Sınıf oluşturuluyor. Bir nesneyi sadece render edebiliyorum ve ikinci nesne oluşturulamıyor. hepsi aynı sınıfta iken OpenGL

ben aynı problem vardı. Nesneleri bot için ayrı bir VBO ve VAO oluşturdum ve problemler çözüldü.

Şimdi bunun dışında bir sınıf oluşturmak çalışıyorum ve şimdi aynı sorunla karşı karşıya ediyorum. Bir sınıf olduğu için ayrı bir VAO ve VBO oluşturulmadı mı?

Model sınıfım ve oyun sınıfım aşağıdaki gibidir. Burada

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

} 

Ve

İşte oyun sınıfı

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

} 

olan çıkıştır. Sadece kutu gösterir ve zemin olmaz.

enter image description here

+0

Orada bu kodda hiçbir sınıflardır. –

+0

Yalnızca .cpp dosyalarını dahil ettim ve üstbilgileri değil. –

cevap

1

Sen Güncelleme'de Çizim çağrısında, gölgelendiriciye üniforma geçmek zorunda. Çünkü gölgelendiricinizi Draw'da etkinleştirin.

Kontrol Bu örnek http://in2gpu.com/2015/06/04/drawing-a-cube/

+0

Ya teşekkürler. Tam olarak sorun buydu. Sorunun ne olduğunu öğrenmek için Sergiu'ya mesaj gönderdim. Tek tek modeller için, üniformalarını güncelleme sırasında geçmek ve çalışmak için kullanıyorum. Aynı mantığı kullandım ve çok kötü başarısız oldu. Teşekkürler. :) –

+0

Evet, ben Sergiu: D – CrSe