2016-03-28 7 views
0

こんにちはすべて私は、OpenGLでモデルクラスを作成し、ゲームでモデルクラスのインスタンスを作成しようとしています。私はただ1つのオブジェクトをレンダリングすることができ、2番目のオブジェクトはレンダリングしません。OpenGlでのモデルクラスの作成

私は同じクラスにすべて同じ問題がありました。私はオブジェクトをボットのための別々の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

+0

この例をチェックしてください。 –

+0

ヘッダーではなく、.cppファイルのみが含まれています。 –

答えて

1

あなたはドローコールではありませんアップデートでは、シェーダに制服を渡す必要があります。 Drawでシェーダをアクティブにするからです。

は、このコードにはクラスはありません http://in2gpu.com/2015/06/04/drawing-a-cube/

+0

よろしくお願いします。それがまさに問題でした。私はSergiuに問題が何かを知るためにメッセージを送る。個々のモデルについては、私は更新のユニフォームを渡すために使用し、それは以前は働いていました。私は同じ論理に慣れていて、それはかなり悪くなった。ありがとう。 :) –

+0

うん、それは私ですSergiu:D – CrSe

関連する問題