2016-03-28 200 views
0

嗨,我想在opengl中創建一個模型類,並在遊戲中創建模型類的一個實例。我能夠渲染一個對象而第二個對象不渲染。在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