Advertisement
Guest User

Untitled

a guest
Jan 27th, 2014
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.89 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////////
  2. // Procedure DrawScene is called whenever the scene needs to be drawn.
  3. void DrawScene(Scene &scene)
  4. {
  5.     CHECKERROR;
  6.  
  7.     int loc, program;
  8.  
  9.     // Calculate the light's position.
  10.     float lPos[4] = {
  11.        scene.lightDist*cos(scene.lightSpin*rad)*sin(scene.lightTilt*rad),
  12.        scene.lightDist*sin(scene.lightSpin*rad)*sin(scene.lightTilt*rad),
  13.        scene.lightDist*cos(scene.lightTilt*rad),
  14.        1.0 };
  15.        
  16.     mat4x4 SphereModelTr = rotate(atime, 0.0f, 0.0f, 1.0f);
  17.     mat4x4 SunModelTr = translate(lPos[0],lPos[1],lPos[2]);
  18.     mat4x4 field1 = translate(0.0f,-150.0f,0.0f);
  19.  
  20.     mat4x4 field2 = translate(-150.0f,0.0f,0.0f);
  21.     mat4x4 field3 = translate(150.0f,0.0f,0.0f);
  22.     mat4x4 field4 = translate(0.0f,150.0f,0.0f);
  23.  
  24.     mat4 shadowTestGeo = rotate(180.0f,1.0f,0.0f,0.0f);
  25.     shadowTestGeo = translate(shadowTestGeo,0.0f,0.0f,-5.0f);
  26.     shadowTestGeo = scale(shadowTestGeo,0.2f,0.2f,0.2f);
  27.  
  28.     mat4x4 daBasementTrans = translate(150.0f,-150.0f,-20.0f);
  29.     mat4x4 daBasementTransform = scale(daBasementTrans,10.0f,10.0f,1.0f);
  30.     mat4x4 groundPlane = scale(Identity,10.0f,10.0f,10.0f);
  31.  
  32.     mat4x4 treeTrans1_a = Identity;
  33.     mat4x4 treeTrans1_b = translate(0.0f,-50.0f,-35.0f);
  34.     mat4x4 treeTrans1 = scale(treeTrans1_b,6.0f,6.0f,6.0f);
  35.  
  36.     vec3 transVec(5,0,0);
  37.     mat4x4 tree2Trans = translate(treeTrans1,transVec);
  38.     transVec = vec3(-5,0,0);
  39.     mat4x4 tree3Trans = translate(treeTrans1,transVec);
  40.  
  41.  
  42.     float sx, sy;
  43.     sy = 0.6f*scene.front;
  44.     sx = sy * scene.width/scene.height;
  45.  
  46.     //mat4x4 T1 = translate(scene.translatex, scene.translatey, -scene.zoom);
  47.     //mat4x4 T2 = rotate(T1, scene.eyeTilt, 1.0f, 0.0f, 0.0f);
  48.     //mat4x4 WorldView = rotate(T2, scene.eyeSpin, 0.0f, 0.0f, 1.0f);
  49.     //test yo
  50.     mat4x4 WorldView;
  51.     vec3 cameraPos;
  52.     if(scene.camFreeform)
  53.     {
  54.         scene.camera->Update(0);
  55.         //mat4x4 T1 = translate(scene.camera->pos.x, scene.camera->pos.y, -scene.camera->pos.z);
  56.         //mat4x4 T2 = rotate(T1, scene.camera->alpha, 1.0f, 0.0f, 0.0f);
  57.         //WorldView = rotate(T2, scene.camera->beta, 0.0f, 0.0f, 1.0f);
  58.         //mat4x4 WorldView = lookAt()
  59.         WorldView = lookAt(scene.camera->pos,
  60.             (scene.camera->target),
  61.             (scene.camera->upVector));
  62.  
  63.         cameraPos = vec3(scene.camera->pos.x, scene.camera->pos.y, scene.camera->pos.z);
  64.  
  65.     }
  66.     else
  67.     {
  68.         mat4x4 T1 = translate(scene.translatex, scene.translatey, -scene.zoom);
  69.         mat4x4 T2 = rotate(T1, scene.eyeTilt, 1.0f, 0.0f, 0.0f);
  70.         WorldView = rotate(T2, scene.eyeSpin, 0.0f, 0.0f, 1.0f);
  71.         cameraPos = vec3(scene.translatex,scene.translatey,scene.zoom);
  72.     }
  73.  
  74.  
  75.     mat4x4 WorldInv = affineInverse(WorldView);
  76.     mat4x4 WorldProj = frustum(-sx, sx, -sy, sy, scene.front, 10000.0f);
  77.     mat4x4 orthoProj = ortho(0.f, (float)scene.width, 0.0f,(float)scene.height, scene.front, 10000.0f);
  78.    
  79.  
  80.     GraphicsSystemNS::g_GraphicsGL->worldProj = WorldProj;
  81.     GraphicsSystemNS::g_GraphicsGL->worldViewInverse = WorldInv;
  82.     GraphicsSystemNS::g_GraphicsGL->worldView = WorldView;
  83.     GraphicsSystemNS::g_GraphicsGL->orthoProj = orthoProj;
  84.     GraphicsSystemNS::g_GraphicsGL->testTexture = scene.groundColor;
  85.     GraphicsSystemNS::g_GraphicsGL->initialPointLight->pos = vec4(lPos[0],lPos[1],
  86.                                                           lPos[2],lPos[3]) ;
  87.  
  88.  
  89.  
  90.  
  91.     mat4x4 SunModelTr2 = translate(GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.x,
  92.         GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.y,
  93.         GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.z);
  94.     //GraphicsSystemNS::g_GraphicsGL->lights[1]->pos *= WorldView;
  95.  
  96.  
  97.  
  98.  
  99.     vec3 lightPos = vec3(GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.x,
  100.         GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.y,
  101.         GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.z);
  102.  
  103.     vec3 lightToTarget = GraphicsSystemNS::g_GraphicsGL->m_SpotLight->target - vec3(GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.x,
  104.                                                                                     GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.y,
  105.                                                                                     GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.z);
  106.     vec3 lightUp = cross(lightToTarget,vec3(-1.0f,0.0f,0.0f) ); // cross product between light to target and right vec
  107.  
  108.  
  109.  
  110.     GraphicsSystemNS::g_GraphicsGL->m_SpotLight->target = vec3(0.0,-50.0,-35.0);
  111.  
  112.     mat4x4 worldViewLight = lookAt(lightPos,
  113.         (GraphicsSystemNS::g_GraphicsGL->m_SpotLight->target ),
  114.         normalize(vec3(0,0,1))); // this "up" has to be calculated correctly based on the light orientation(because its a spotlight, it can be rotated as well, so i cant assume just 1 for up)
  115.  
  116.  
  117.     mat4x4 WorldInvShadow = affineInverse(worldViewLight);
  118.  
  119.     mat4x4 shadowProj = glm::perspective(scene.atten * 2.0f, 1.0f, LIGHT_CLIP_NEAR, LIGHT_CLIP_FAR);
  120.  
  121.     mat4 shadowViewTrans = transpose(worldViewLight);
  122.     shadowViewTrans = translate(shadowViewTrans,0.5f,0.5f,0.5f);
  123.     mat4 shadowProjTrans = transpose(shadowProj);
  124.     //shadowProjTrans = translate(shadowProjTrans,0.5f,0.5f,0.5f);
  125.  
  126.  
  127.  
  128.  
  129.     glutTimerFunc(100, animate, 1);
  130.  
  131.  
  132.  
  133.     ///////////////////////////////////////////////////////////////////
  134.     // SHADOW Pass: The geometry of the scene is drawn to the FBO
  135.     // render target.
  136.     ///////////////////////////////////////////////////////////////////
  137.  
  138.     program = scene.shaderSHADOW.program;
  139.     scene.shaderSHADOW.Use();
  140.  
  141.     // Select drawing to the FBO, set its viewport, and clear
  142.     scene.fboSHADOW.Bind();
  143.     glViewport(0, 0, scene.shadowsizeX, scene.shadowsizeY);
  144.     glClearColor(1.0, 1.0, 1.0, 1.0);
  145.     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
  146.  
  147.     glCullFace(GL_FRONT);
  148.     // Setup the perspective and modelview matrices for normal viewing.
  149.     loc = glGetUniformLocation(program, "ProjectionMatrix");
  150.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(shadowProj));
  151.     loc = glGetUniformLocation(program, "ViewMatrix");
  152.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(worldViewLight));
  153.     loc = glGetUniformLocation(program, "ViewInverse");
  154.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldInvShadow));
  155.     CHECKERROR;
  156.  
  157.     // Setup the initial model matrix (in gl_ModelViewMatrix)
  158.     loc = glGetUniformLocation(program, "ModelMatrix");
  159.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  160.     loc = glGetUniformLocation(program, "NormalMatrix");
  161.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  162.     CHECKERROR;
  163.  
  164.     loc = glGetUniformLocation(program,"clipDistance");
  165.     glUniform2f(loc,LIGHT_CLIP_NEAR,  LIGHT_CLIP_NEAR - LIGHT_CLIP_FAR);
  166.  
  167.  
  168.     GLuint glArrayshadow[] = {GL_COLOR_ATTACHMENT0_EXT};
  169.  
  170.     glDrawBuffers(1,glArrayshadow);
  171.  
  172.     GraphicsSystemNS::g_GraphicsGL->DrawTree(program,treeTrans1);
  173.     GraphicsSystemNS::g_GraphicsGL->DrawTree(program,tree2Trans);
  174.     GraphicsSystemNS::g_GraphicsGL->DrawTree(program,tree3Trans);
  175.     //DrawGround(scene, program, shadowTestGeo);
  176.     //DrawGround(scene, program, Identity);
  177.  
  178.     glCullFace(GL_BACK);
  179.     scene.fboSHADOW.Unbind();
  180.  
  181.     // Remove shader program
  182.     scene.shaderSHADOW.Unuse();
  183.     CHECKERROR;
  184.  
  185.  
  186.  
  187.  
  188.  
  189.     ///////////////////////////////////////////////////////////////////
  190.     // G-BUFFER PASS
  191.     ///////////////////////////////////////////////////////////////////
  192.  
  193.  
  194.     program = scene.shaderGBUFFER.program;
  195.  
  196.     // Use final pass shader
  197.     scene.shaderGBUFFER.Use();
  198.     CHECKERROR;
  199.     GraphicsSystemNS::g_GraphicsGL->fbo_gBuffer.Bind();
  200.     CHECKERROR;
  201.  
  202.     // Set the viewport, and clear the screen
  203.     glViewport(0,0,scene.width, scene.height);
  204.     glClearColor(0.0,0.0, 0.0, 1.0);
  205.     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
  206.  
  207.  
  208.     // Setup the perspective and modelview matrices for normal viewing.
  209.     loc = glGetUniformLocation(program, "ProjectionMatrix");
  210.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldProj));
  211.     loc = glGetUniformLocation(program, "ViewMatrix");
  212.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldView));
  213.     loc = glGetUniformLocation(program, "ViewInverse");
  214.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldInv));
  215.     CHECKERROR;
  216.  
  217.     // Setup the initial model matrix (in gl_ModelViewMatrix)
  218.     loc = glGetUniformLocation(program, "ModelMatrix");
  219.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  220.     loc = glGetUniformLocation(program, "NormalMatrix");
  221.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  222.     CHECKERROR;
  223.  
  224.     GLuint glArray[] = {GL_COLOR_ATTACHMENT0_EXT,
  225.                         GL_COLOR_ATTACHMENT1_EXT,
  226.                         GL_COLOR_ATTACHMENT2_EXT};
  227.  
  228.     glDrawBuffers(3,glArray);
  229.     // Draw the scene objects.
  230.     DrawSun(scene, program, SunModelTr);
  231.     GraphicsSystemNS::g_GraphicsGL->DrawLightModels(program);
  232.     //DrawSpheres(scene, program, SphereModelTr);
  233.     DrawGround(scene, program, groundPlane);
  234.     //DrawCentral(scene, program, scene.centralTr);
  235.     //DrawGround(scene, program, field1);
  236.     //DrawGround(scene, program, field2);
  237.     //DrawGround(scene, program, field3);
  238.     //DrawGround(scene, program, field4);
  239.     //DrawGround(scene, program, daBasementTransform);
  240.     //DrawGround(scene, program, shadowTestGeo);
  241.  
  242.     GraphicsSystemNS::g_GraphicsGL->DrawTree(program,treeTrans1);
  243.     GraphicsSystemNS::g_GraphicsGL->DrawTree(program,tree2Trans);
  244.     GraphicsSystemNS::g_GraphicsGL->DrawTree(program,tree3Trans);
  245.     CHECKERROR;
  246.  
  247.     // Done with shader program
  248.     GraphicsSystemNS::g_GraphicsGL->fbo_gBuffer.Unbind();
  249.     scene.shaderGBUFFER.Unuse();
  250.     CHECKERROR;
  251.  
  252.  
  253.  
  254.     ///////////////////////////////////////////////////////////////////
  255.     // Render Volume Light                                           //
  256.     ///////////////////////////////////////////////////////////////////
  257.  
  258.  
  259.     program = scene.shaderVOLUMELIGHT.program;
  260.     // Use final pass shader
  261.     scene.shaderVOLUMELIGHT.Use();
  262.     CHECKERROR;
  263.     GraphicsSystemNS::g_GraphicsGL->fbo_VolumeLight.Bind();
  264.     CHECKERROR;
  265.  
  266.  
  267.     // Set the viewport, and clear the screen
  268.     glViewport(0,0,scene.width, scene.height);
  269.     glClearColor(0.0,0.0, 0.0, 1.0);
  270.     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
  271.  
  272.  
  273.     // Setup the perspective and modelview matrices for normal viewing.
  274.     loc = glGetUniformLocation(program, "ProjectionMatrix");
  275.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldProj));
  276.     loc = glGetUniformLocation(program, "ViewMatrix");
  277.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldView));
  278.     loc = glGetUniformLocation(program, "ViewInverse");
  279.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldInv));
  280.     CHECKERROR;
  281.  
  282.     // Setup the initial model matrix (in gl_ModelViewMatrix)
  283.     loc = glGetUniformLocation(program, "ModelMatrix");
  284.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  285.     loc = glGetUniformLocation(program, "NormalMatrix");
  286.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  287.     CHECKERROR;
  288.  
  289.     // Make each texture from earlier passes active in a texture unit, and
  290.     // inform shaderFINAL.
  291.     glActiveTexture(GL_TEXTURE2);
  292.     glBindTexture(GL_TEXTURE_2D, scene.fboSHADOW.texture);
  293.     loc = glGetUniformLocation(program, "ldepth");
  294.     glUniform1i(loc, 2);
  295.     CHECKERROR;
  296.  
  297.     glActiveTexture(GL_TEXTURE3);
  298.     glBindTexture(GL_TEXTURE_2D, GraphicsSystemNS::g_GraphicsGL->fbo_gBuffer.texture);
  299.     loc = glGetUniformLocation(program, "gBufferPos");
  300.     glUniform1i(loc, 3);
  301.     CHECKERROR;
  302.  
  303.  
  304.     loc = glGetUniformLocation(program, "mode");
  305.     glUniform1i(loc, scene.mode);
  306.  
  307.     loc = glGetUniformLocation(program, "WIDTH");
  308.     glUniform1i(loc, scene.width);
  309.  
  310.     loc = glGetUniformLocation(program, "HEIGHT");
  311.     glUniform1i(loc, scene.height);
  312.  
  313.     loc = glGetUniformLocation(program, "camNear");
  314.     glUniform1i(loc, scene.front);
  315.  
  316.     loc = glGetUniformLocation(program, "camFar");
  317.     glUniform1i(loc, 10000);
  318.  
  319.     // set target
  320.     loc = glGetUniformLocation(program,"cameraPos");
  321.     glUniform3f(loc,cameraPos.x, cameraPos.y,cameraPos.z);
  322.  
  323.  
  324.     // shadow stuff
  325.     loc = glGetUniformLocation(program,"clipDistance");
  326.     //glUniform2fv(loc,1,vec3(LIGHT_CLIP_NEAR, LIGHT_CLIP_NEAR - LIGHT_CLIP_FAR, 0.0f));   
  327.     glUniform2f(loc,LIGHT_CLIP_NEAR,  LIGHT_CLIP_NEAR - LIGHT_CLIP_FAR);
  328.  
  329.     //mat4 m4 = translate(worldViewTranspose,-lightPos);
  330.     loc = glGetUniformLocation(program, "ShadowViewMatrix");
  331.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(worldViewLight));
  332.  
  333.     loc = glGetUniformLocation(program, "ShadowProjMatrix");
  334.     mat4 mat1_ = translate(Identity,0.5f,0.5f,0.5f);
  335.     mat4 mat2_ = scale(mat1_,0.5f,0.5f,0.5f);
  336.  
  337.     mat4 shadowProjTest_ = mat2_ * shadowProj;
  338.  
  339.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(shadowProjTest_));
  340.  
  341.  
  342.  
  343.  
  344.     loc = glGetUniformLocation(program, "lightProj");
  345.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr((shadowProj*worldViewLight)));
  346.  
  347.     loc = glGetUniformLocation(program, "lightPos");
  348.     glUniform3f(loc,GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.x,GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.y,GraphicsSystemNS::g_GraphicsGL->m_SpotLight->pos.z);
  349.  
  350.     loc = glGetUniformLocation(program,"lightForward");
  351.     //glUniform2fv(loc,1,vec3(LIGHT_CLIP_NEAR, LIGHT_CLIP_NEAR - LIGHT_CLIP_FAR, 0.0f));   
  352.     glUniform3f(loc,GraphicsSystemNS::g_GraphicsGL->m_SpotLight->spotCam->target.x,GraphicsSystemNS::g_GraphicsGL->m_SpotLight->spotCam->target.y,GraphicsSystemNS::g_GraphicsGL->m_SpotLight->spotCam->target.z);
  353.  
  354.  
  355.     GLuint glVLightArr[] = {GL_COLOR_ATTACHMENT0_EXT};
  356.  
  357.     glDrawBuffers(1,glVLightArr); // color attach 0
  358.  
  359.     GraphicsSystemNS::g_GraphicsGL->DrawFullScreenQuad(scene.shaderVOLUMELIGHT);
  360.  
  361.  
  362.  
  363.     // TURN OFF GL BLENDING
  364.     // Done with shader program
  365.     GraphicsSystemNS::g_GraphicsGL->fbo_VolumeLight.Unbind();
  366.     CHECKERROR;
  367.     scene.shaderVOLUMELIGHT.Unuse();
  368.     CHECKERROR;
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.     ///////////////////////////////////////////////////////////////////
  381.     // FINAL SCENE TEST PASS DEFFERED SHADING                        //
  382.     ///////////////////////////////////////////////////////////////////
  383.  
  384.  
  385.     program = scene.shaderDEFFEREDFINAL.program;
  386.     // Use final pass shader
  387.     scene.shaderDEFFEREDFINAL.Use();
  388.     CHECKERROR;
  389.     //GraphicsSystemNS::g_GraphicsGL->fbo_finalTest.Bind();
  390.     CHECKERROR;
  391.  
  392.  
  393.     // Set the viewport, and clear the screen
  394.     glViewport(0,0,scene.width, scene.height);
  395.     glClearColor(0.0,0.0, 0.0, 1.0);
  396.     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
  397.  
  398.  
  399.     // Setup the perspective and modelview matrices for normal viewing.
  400.     loc = glGetUniformLocation(program, "ProjectionMatrix");
  401.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldProj));
  402.     loc = glGetUniformLocation(program, "ViewMatrix");
  403.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldView));
  404.     loc = glGetUniformLocation(program, "ViewInverse");
  405.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(WorldInv));
  406.     CHECKERROR;
  407.  
  408.     // Setup the initial model matrix (in gl_ModelViewMatrix)
  409.     loc = glGetUniformLocation(program, "ModelMatrix");
  410.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  411.     loc = glGetUniformLocation(program, "NormalMatrix");
  412.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(Identity));
  413.     CHECKERROR;
  414.  
  415.     // Make each texture from earlier passes active in a texture unit, and
  416.     // inform shaderFINAL.
  417.     glActiveTexture(GL_TEXTURE2);
  418.     glBindTexture(GL_TEXTURE_2D, scene.fboSHADOW.texture);
  419.     loc = glGetUniformLocation(program, "ldepth");
  420.     glUniform1i(loc, 2);
  421.     CHECKERROR;
  422.  
  423.     glActiveTexture(GL_TEXTURE3);
  424.     glBindTexture(GL_TEXTURE_2D, GraphicsSystemNS::g_GraphicsGL->fbo_gBuffer.texture);
  425.     loc = glGetUniformLocation(program, "gBufferPos");
  426.     glUniform1i(loc, 3);
  427.     CHECKERROR;
  428.  
  429.     glActiveTexture(GL_TEXTURE4);
  430.     glBindTexture(GL_TEXTURE_2D, GraphicsSystemNS::g_GraphicsGL->fbo_gBuffer.texture1);
  431.     loc = glGetUniformLocation(program, "gBufferNormal");
  432.     glUniform1i(loc, 4);
  433.     CHECKERROR;
  434.  
  435.     glActiveTexture(GL_TEXTURE5);
  436.     glBindTexture(GL_TEXTURE_2D, GraphicsSystemNS::g_GraphicsGL->fbo_gBuffer.texture2);
  437.     loc = glGetUniformLocation(program, "gBufferDiffuse");
  438.     glUniform1i(loc, 5);
  439.     CHECKERROR;
  440.  
  441.     glActiveTexture(GL_TEXTURE6);
  442.     glBindTexture(GL_TEXTURE_2D, GraphicsSystemNS::g_GraphicsGL->fbo_VolumeLight.texture);
  443.     loc = glGetUniformLocation(program, "volumeLightTex");
  444.     glUniform1i(loc, 6);
  445.     CHECKERROR;
  446.  
  447.  
  448.     loc = glGetUniformLocation(program, "mode");
  449.     glUniform1i(loc, scene.mode);
  450.  
  451.     loc = glGetUniformLocation(program, "WIDTH");
  452.     glUniform1i(loc, scene.width);
  453.  
  454.     loc = glGetUniformLocation(program, "HEIGHT");
  455.     glUniform1i(loc, scene.height);
  456.  
  457.  
  458.     // set target
  459.     loc = glGetUniformLocation(program,"cameraPos");
  460.     glUniform3f(loc,cameraPos.x, cameraPos.y,cameraPos.z);
  461.  
  462.  
  463.     // shadow stuff
  464.     loc = glGetUniformLocation(program,"clipDistance");
  465.     glUniform2f(loc,LIGHT_CLIP_NEAR,  LIGHT_CLIP_NEAR - LIGHT_CLIP_FAR);
  466.  
  467.     //mat4 m4 = translate(worldViewTranspose,-lightPos);
  468.     loc = glGetUniformLocation(program, "ShadowViewMatrix");
  469.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(worldViewLight));
  470.  
  471.     loc = glGetUniformLocation(program, "ShadowProjMatrix");
  472.     mat4 mat1 = translate(Identity,0.5f,0.5f,0.5f);
  473.     mat4 mat2 = scale(mat1,0.5f,0.5f,0.5f);
  474.  
  475.     mat4 shadowProjTest = mat2 * shadowProj;
  476.  
  477.     glUniformMatrix4fv(loc, 1, GL_FALSE, value_ptr(shadowProjTest));
  478.  
  479.  
  480.  
  481.  
  482.  
  483.     // draw diredtional light( all "big" lights go here)
  484.  
  485.     GraphicsSystemNS::g_GraphicsGL->UpdateLightParams(scene.shaderDEFFEREDFINAL,GraphicsSystemNS::g_GraphicsGL->directionalLight);
  486.     CHECKERROR;
  487.  
  488.     GraphicsSystemNS::g_GraphicsGL->DrawFullScreenQuad(scene.shaderDEFFEREDFINAL);
  489.     CHECKERROR;
  490.  
  491.  
  492.  
  493.  
  494.     // all small local lights go here
  495.     glEnable(GL_BLEND);
  496.     glDisable(GL_DEPTH_TEST);
  497.     //turn on glblending
  498.     //GLBLENGI N
  499.  
  500.     glBlendEquation(GL_FUNC_ADD);
  501.     glBlendFunc(GL_ONE,GL_ONE);
  502.  
  503.  
  504.     // Draw the scene objects.
  505.     for(int i = 0; i < GraphicsSystemNS::g_GraphicsGL->lights.size(); ++i)
  506.     {
  507.  
  508.         //update light params for current light
  509.         if(GraphicsSystemNS::g_GraphicsGL->lights[i]->render == false)
  510.             continue;;
  511.  
  512.         GraphicsSystemNS::g_GraphicsGL->UpdateLightParams(scene.shaderDEFFEREDFINAL,i);
  513.         CHECKERROR;
  514.  
  515.  
  516.         //GLuint glDefferedArr[] = {GL_COLOR_ATTACHMENT0_EXT};
  517.  
  518.         //glDrawBuffers(1,glDefferedArr); // color attach 0
  519.          
  520.         GraphicsSystemNS::g_GraphicsGL->DrawFullScreenQuad(scene.shaderDEFFEREDFINAL);
  521.         CHECKERROR;
  522.     }
  523.  
  524.     CHECKERROR;
  525.  
  526.     glDisable(GL_BLEND);
  527.     glEnable(GL_DEPTH_TEST);
  528.  
  529.  
  530.     // TURN OFF GL BLENDING
  531.     // Done with shader program
  532.     //GraphicsSystemNS::g_GraphicsGL->fbo_finalTest.Unbind();
  533.     CHECKERROR;
  534.     scene.shaderDEFFEREDFINAL.Unuse();
  535.     CHECKERROR;
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.     ///////////////////////////////////////////////////////////////////
  546.     // Final pass: Draw the scene normally after making the output of
  547.     // shaderREFL available to the shaderFINAL program.
  548.     ///////////////////////////////////////////////////////////////////
  549.  
  550.     program = scene.shaderFINAL.program;
  551.     // Set the viewport, and clear the screen
  552.     //glViewport(0,0,scene.width, scene.height);
  553.     glClearColor(0.5,0.5, 0.5, 1.0);
  554.     glClear(GL_DEPTH_BUFFER_BIT);
  555.  
  556.     // Use final pass shader
  557.     scene.shaderFINAL.Use();
  558.  
  559.     GraphicsSystemNS::g_GraphicsGL->DrawPosBuffer(scene.shaderFINAL);
  560.     GraphicsSystemNS::g_GraphicsGL->DrawNormalBuffer(scene.shaderFINAL);
  561.     GraphicsSystemNS::g_GraphicsGL->DrawDiffuseBuffer(scene.shaderFINAL);
  562.     GraphicsSystemNS::g_GraphicsGL->DrawShadowMap(scene.shaderFINAL,scene.fboSHADOW);
  563.     GraphicsSystemNS::g_GraphicsGL->DrawVolumeLightBuffer(scene.shaderFINAL);
  564.     //GraphicsSystemNS::g_GraphicsGL->DrawDefferedFinalSceneTEST(scene.shaderFINAL);
  565. //  GraphicsSystemNS::g_GraphicsGL->DrawFullScreenQuad(scene.shaderFINAL);
  566.  
  567.     CHECKERROR;
  568.  
  569.     // Done with shader program
  570.     scene.shaderFINAL.Unuse();
  571.     CHECKERROR;
  572.  
  573.  
  574. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement