opengl环境配置可参照上一篇博客opengl环境配置+GLFW+GLEW+VS2017
void GraphicRenderer::DrawSprite(int modetype,glm::mat4 modelview, Texture2D texture, glm::vec3 position, glm::vec3 size, glm::vec3 rotate, glm::vec3 color)
{
// Prepare transformations
this->shader.Use();//绑定shader
glm::mat4 model = modelview;
model = glm::translate(model, glm::vec3(position)); // 平移
model = glm::rotate(model, rotate[0], glm::vec3(1.0f, 0.0f, 0.0f)); //绕X轴旋转
model = glm::rotate(model, rotate[1], glm::vec3(0.0f, 1.0f, 0.0f)); // 绕Y轴旋转
model = glm::rotate(model, rotate[2], glm::vec3(0.0f, 0.0f, 1.0f)); // 绕Z轴旋转
model = glm::scale(model, glm::vec3(size)); //缩放
this->shader.SetMatrix4("model", model);//模型矩阵
this->shader.SetVector3f("spriteColor", color);//传入颜色
glActiveTexture(GL_TEXTURE0);//绑定纹理
texture.Bind();
if (modetype == 0)//四边形
{
glBindVertexArray(this->quadVAO);
glDrawArrays(GL_TRIANGLES, 0, 6);
}
if (modetype == 1)//正方体
{
glBindVertexArray(this->cubeVAO);
glDrawArrays(GL_TRIANGLES, 0, 36);
}
if (modetype == 2)//球体
{
glBindVertexArray(this->shpereVAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, shpereVEO);
glDrawElements(GL_TRIANGLES, (40 - 1)*(30 - 1) * 6, GL_UNSIGNED_INT, (void *)0);
}
glActiveTexture(0);
glBindVertexArray(0);
glUseProgram(0);
}
void Render()
{
//shader 1 光照
ResourceManager::GetShader("GraphicLight").Use();
glm::mat4 view = camera.GetViewMatrix();
ResourceManager::GetShader("GraphicLight").SetMatrix4("view", view);
ResourceManager::GetShader("GraphicLight").SetVector3f("viewPos", camera.Position);
glm::mat4 model;
Renderer->SetShader(ResourceManager::GetShader("GraphicLight"));
//绘制地面
Renderer->DrawSprite(1, model, ResourceManager::GetTexture("smoke"), glm::vec3(0, -1.0, 0), glm::vec3(1000, 1, 1000.0), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
//绘制墙壁
{
glm::mat4 model1 = glm::translate(model, glm::vec3(60.0, 0.0, 0.0));
model1 = glm::scale(model, glm::vec3(1.2, 1.0, 1.0));
Renderer->DrawSprite(1, model1, ResourceManager::GetTexture("wall"), glm::vec3(0, 50, 0), glm::vec3(300, 100, 300.0), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
//门
Renderer->DrawSprite(1, model, ResourceManager::GetTexture("door"), glm::vec3(160, 35, 150), glm::vec3(30, 70, 1.0), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
}
//绘制雪人
DrawXueren(model);
shader 3 室内
ResourceManager::GetShader("Graphic").Use();
ResourceManager::GetShader("Graphic").SetMatrix4("view", view);
Renderer->SetShader(ResourceManager::GetShader("Graphic"));
model = glm::translate(model, glm::vec3(0, 0, 0));
绘制路灯
DrawRoadLight(model);
//房间1;
DrawRoom1(model);
//房间2
DrawRoom2(model);
//房间3
DrawRoom3(model);
//shader 2 雪花
ResourceManager::GetShader("Particle").Use();
//ResourceManager::GetShader("Particle").SetMatrix4("projection", projection);
ResourceManager::GetShader("Particle").SetMatrix4("view", view);
//绘制雪花
m_ParticleGenerator->Draw(model);
}