const int ReflectedObject::Draw( Camera* camera, GLShaderManager* shaderManager, TextureManager* textureManager, Light* light ) { // Set the correct texture glBindTexture( GL_TEXTURE_2D, textureFile ); // Matrices needed M3DMatrix44f mCamera; M3DMatrix44f mCameraRotOnly; M3DMatrix44f mInverseCamera; // Get the matrices from the camera camera->cameraFrame.GetCameraMatrix(mCamera, false); camera->cameraFrame.GetCameraMatrix(mCameraRotOnly, true); m3dInvertMatrix44(mInverseCamera, mCameraRotOnly); camera->modelViewMatrix.PushMatrix(); //Draw the sphere camera->modelViewMatrix.MultMatrix( mCamera ); camera->modelViewMatrix.MultMatrix( frame ); glUseProgram( shaderFile ); glUniformMatrix4fv(locMVPReflect, 1, GL_FALSE, camera->transformPipeline.GetModelViewProjectionMatrix()); glUniformMatrix4fv(locMVReflect, 1, GL_FALSE, camera->transformPipeline.GetModelViewMatrix()); glUniformMatrix3fv(locNormalReflect, 1, GL_FALSE, camera->transformPipeline.GetNormalMatrix()); glUniformMatrix4fv(locInvertedCamera, 1, GL_FALSE, mInverseCamera); glUniform1i(locCubeMap, 1); glUniform1i(locTarnishMap, 0); triBatch.Draw(); camera->modelViewMatrix.PopMatrix(); return SHR_SUCCESS; }
// Called to draw scene void RenderScene(void) { // Clear the window glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); frameCamera.ApplyCameraTransform(); // Move the camera about // Sky Box is manually textured glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_CUBE_MAP); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); DrawSkyBox(); // Use texgen to apply cube map glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glPushMatrix(); glTranslatef(0.0f, 0.0f, -3.0f); glActiveTexture(GL_TEXTURE1); glMatrixMode(GL_TEXTURE); glPushMatrix(); // Invert camera matrix (rotation only) and apply to // texture coordinates M3DMatrix44f m, invert; frameCamera.GetCameraOrientation(m); m3dInvertMatrix44(invert, m); glMultMatrixf(invert); glColor3f(1.0f, 1.0f, 1.0f); gltDrawSphere(0.75f, 41, 41); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glPopMatrix(); // Do the buffer Swap glutSwapBuffers(); }
void DrawGLScene() // Main Drawing Routine { GLmatrix16f Minv, Inv; GLvector4f lp; // Clear Color Buffer, Depth Buffer, Stencil Buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glColor4f(0.7f, 0.4f, 0.0f, 1.0f); glLoadIdentity(); glPushMatrix(); { glTranslatef(0.0f, 0.0f, -20.0f); // Zoom Into Screen 20 Units glLightfv(GL_LIGHT1, GL_POSITION, LightPos); // Position Light1 glTranslatef(SpherePos[0], SpherePos[1], SpherePos[2]); // Position The Sphere gluSphere(q, 1.5f, 32, 16); // Draw A Sphere } glPopMatrix(); glPushMatrix(); { glTranslatef(0.0f, 0.0f, -20.0f); // Zoom Into The Screen 20 Units DrawGLRoom(); // Draw The Room glTranslatef(ObjPos[0], ObjPos[1], ObjPos[2]); // Position The Object glRotatef(xrot, 1.0f, 0.0f, 0.0f); // Spin It On The X Axis By xrot glRotatef(yrot, 0.0f, 1.0f, 0.0f); // Spin It On The Y Axis By yrot DrawGLObject(obj); // Procedure For Drawing The Loaded Object // 获得光源的位置(返回值是在视觉坐标系下的) glGetLightfv(GL_LIGHT1, GL_POSITION, lp); glGetFloatv(GL_MODELVIEW_MATRIX, Minv); m3dInvertMatrix44(Inv, Minv); // 把光源位置从视觉坐标系下变换到当前的场景坐标系(obj)下. VMatMult(Inv, lp); // 开始渲染阴影 CastShadow(&obj, lp); // 用一个小黄球标记出光源的位置 glPushMatrix(); { glColor4f(0.7f, 0.4f, 0.0f, 1.0f); // Set Color To Purplish Blue glDisable(GL_LIGHTING); // Disable Lighting glDepthMask(GL_FALSE); // Disable Depth Mask glTranslatef(lp[0], lp[1], lp[2]); gluSphere(q, 0.2f, 16, 8); glEnable(GL_LIGHTING); // Enable Lighting glDepthMask(GL_TRUE); // Enable Depth Mask } glPopMatrix(); } glPopMatrix(); xrot += xspeed; yrot += yspeed; glFlush(); glutSwapBuffers(); }
// Called to draw scene void RenderScene(void) { // Clear the window glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); M3DMatrix44f mCamera; M3DMatrix44f mCameraRotOnly; M3DMatrix44f mInverseCamera; viewFrame.GetCameraMatrix(mCamera, false); viewFrame.GetCameraMatrix(mCameraRotOnly, true); m3dInvertMatrix44(mInverseCamera, mCameraRotOnly); modelViewMatrix.PushMatrix(); // Draw the sphere modelViewMatrix.MultMatrix(mCamera); glUseProgram(reflectionShader); glUniformMatrix4fv(locMVPReflect, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix()); glUniformMatrix4fv(locMVReflect, 1, GL_FALSE, transformPipeline.GetModelViewMatrix()); glUniformMatrix3fv(locNormalReflect, 1, GL_FALSE, transformPipeline.GetNormalMatrix()); glUniformMatrix4fv(locInvertedCamera, 1, GL_FALSE, mInverseCamera); glUniform1i(locCubeMap, 0); glUniform1i(locTarnishMap, 1); glEnable(GL_CULL_FACE); sphereBatch.Draw(); glDisable(GL_CULL_FACE); modelViewMatrix.PopMatrix(); modelViewMatrix.PushMatrix(); modelViewMatrix.MultMatrix(mCameraRotOnly); glUseProgram(skyBoxShader); glUniformMatrix4fv(locMVPSkyBox, 1, GL_FALSE, transformPipeline.GetModelViewProjectionMatrix()); cubeBatch.Draw(); modelViewMatrix.PopMatrix(); // Do the buffer Swap glutSwapBuffers(); }
// Called to draw scene objects void DrawModels(void) { M3DVector3f lightPosEye; M3DMatrix44f mv, mv2; M3DMatrix44f mv2IT_4x4; GLfloat mv2IT_3x3[9]; GLint i; // Transform light position to eye space glGetFloatv(GL_MODELVIEW_MATRIX, mv); m3dTransformVector3(lightPosEye, lightPos, mv); glUniform3fv(lightPosLoc, 1, lightPosEye); // Setup modelview matrices for upper arm glPushMatrix(); glRotatef(elbowBend, 0.0f, 0.0f, 1.0f); glTranslatef(-50.0f, 0.0f, 0.0f); glGetFloatv(GL_MODELVIEW_MATRIX, mv2); glPopMatrix(); glTranslatef(-50.0f, 0.0f, 0.0f); glUniformMatrix4fv(mv2Loc, 1, GL_FALSE, mv2); m3dInvertMatrix44(mv2IT_4x4, mv2); // Take upper left 3x3 for 2nd normal matrix for (i = 0; i < 9; i++) { mv2IT_3x3[i] = mv2IT_4x4[((i/3)*4)+(i%3)]; } glUniformMatrix3fv(mv2ITLoc, 1, GL_TRUE, mv2IT_3x3); // Draw upper arm cylinder glColor3f(0.0f, 0.0f, 0.90f); // Blue // 50 long, 10 shoulder, 9 elbow, with weights applied to second half DrawCylinder(50.0f, 15.0f, 9.0f, 1.0f, 0.5f); // Setup modelview matrices for forearm glTranslatef(50.0f, 0.0f, 0.0f); glPushMatrix(); glGetFloatv(GL_MODELVIEW_MATRIX, mv2); glPopMatrix(); glRotatef(elbowBend, 0.0f, 0.0f, 1.0f); glUniformMatrix4fv(mv2Loc, 1, GL_FALSE, mv2); m3dInvertMatrix44(mv2IT_4x4, mv2); // Take upper left 3x3 for 2nd normal matrix for (i = 0; i < 9; i++) { mv2IT_3x3[i] = mv2IT_4x4[((i/3)*4)+(i%3)]; } glUniformMatrix3fv(mv2ITLoc, 1, GL_TRUE, mv2IT_3x3); // Draw forearm cylinder glColor3f(0.9f, 0.0f, 0.0f); // Red // 40 long, 9 elbow, 5 wrist, with weights applied to first half DrawCylinder(40.0f, 9.0f, 5.0f, 0.5f, 1.0f); }