#include "scene.h" #include "ggl.h" #include "utils.h" #include "ground.h" #include "shader.h" #include "model.h" #include "skybox.h" #include "particleSystem.h" #include "framebufferobject.h" glm::mat4 modelMatrix, viewMatrix, projectionMatrix; glm::vec3 cameraPos(10.0f, 10.0f, 10.0f); Ground ground; Model model, niutou, sphere; SkyBox skybox; ParticleSystem ps; FrameBufferObject *fbo; VertexBuffer *fsqVertex; Shader *fsqShader; glm::mat4 fsqViewMatrix; void Init() { viewMatrix = glm::lookAt(cameraPos, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f,1.0f,0.0f)); ground.Init(); model.Init("Res/Sphere.obj"); model.SetTexture("Res/earth.bmp"); model.SetPosition(0.0f, 0.0f, 0.0f); skybox.Init("Res/"); niutou.Init("Res/niutou.obj"); niutou.SetTexture("Res/niutou.bmp"); niutou.mModelMatrix = glm::translate(-5.0f, 0.0f, 4.0f)*glm::scale(0.05f, 0.05f, 0.05f); ps.Init(0.0f, 0.0f, 0.0f); } void SetViewPortSize(float width, float height) { projectionMatrix = glm::perspective(60.0f, width / height, 0.1f, 1000.0f); fbo = new FrameBufferObject; fbo->AttachColorBuffer("color", GL_COLOR_ATTACHMENT0, (int)width, (int)height); fbo->AttachColorBuffer("color1", GL_COLOR_ATTACHMENT1, (int)width, (int)height); fbo->AttachDepthBuffer("depth", (int)width, (int)height); fbo->Finish(); sphere.Init("Res/Sphere.obj"); sphere.SetTexture(fbo->GetBuffer("color")); sphere.mModelMatrix = glm::scale(4.0f, 4.0f, 4.0f)*glm::rotate(150.0f, 0.0f, 1.0f, 0.0f); float aspect = width / height; float halfFOV = 60.0f / 2.0f; float randianHalfFOV = 3.14f*halfFOV / 180.0f; float tanHalfFOV = sinf(randianHalfFOV) / cosf(randianHalfFOV); float y = tanHalfFOV*0.2f; float x = y*aspect; fsqVertex = new VertexBuffer; fsqVertex->SetSize(4); fsqVertex->SetPosition(0, -x, -y, -0.2f); fsqVertex->SetTexcoord(0, 0.0f, 0.0f); fsqVertex->SetPosition(1, x, -y, -0.2f); fsqVertex->SetTexcoord(1, 1.0f, 0.0f); fsqVertex->SetPosition(2, -x, y, -0.2f); fsqVertex->SetTexcoord(2, 0.0f, 1.0f); fsqVertex->SetPosition(3, x, y, -0.2f); fsqVertex->SetTexcoord(3, 1.0f, 1.0f); fsqShader = new Shader; fsqShader->Init("Res/texture.vs", "Res/texture.fs"); fsqShader->SetTexture("U_Texture", fbo->GetBuffer("color")); } void Draw() { float frameTime = GetFrameTime(); glClearColor(0.1f, 0.4f, 0.6f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); fbo->Bind(); skybox.Draw(viewMatrix, projectionMatrix, cameraPos.x, cameraPos.y, cameraPos.z); ground.Draw(viewMatrix, projectionMatrix); model.Draw(viewMatrix, projectionMatrix, cameraPos.x, cameraPos.y, cameraPos.z); niutou.Draw(viewMatrix, projectionMatrix, cameraPos.x, cameraPos.y, cameraPos.z); ps.Update(frameTime); ps.Draw(viewMatrix, projectionMatrix); fbo->Unbind(); //sphere.Draw(viewMatrix, projectionMatrix, cameraPos.x, cameraPos.y, cameraPos.z); fsqVertex->Bind(); fsqShader->Bind(glm::value_ptr(modelMatrix), glm::value_ptr(fsqViewMatrix), glm::value_ptr(projectionMatrix)); glDrawArrays(GL_TRIANGLE_STRIP, 0, fsqVertex->mVertexCount); fsqVertex->Unbind(); }