void PezRender(GLuint fbo) { glUniform1f(Uniforms.TessLevel, TessLevel); glUniform1f(Uniforms.TessLevelOuter, TessLevelOuter); glUniform1f(Uniforms.NormalModel, NormalModel); glUniform1f(Uniforms.Tesselation, Tesselation); glUniform1f(Uniforms.Wireframe, Wireframe); glUniform1f(Uniforms.Tagg, Tagg); glUniform1f(Uniforms.ColNorm, ColNorm); glUniform1f(Uniforms.DCol, DCol); Vector4 lightPosition = V4MakeFromElems(0.25, 0.25, 1, 0); glUniform3fv(Uniforms.LightPosition, 1, &lightPosition.x); glUniformMatrix4fv(Uniforms.Projection, 1, 0, &ProjectionMatrix.col0.x); glUniformMatrix4fv(Uniforms.Modelview, 1, 0, &ModelviewMatrix.col0.x); Matrix3 nm = M3Transpose(NormalMatrix); float packed[9] = { nm.col0.x, nm.col1.x, nm.col2.x, nm.col0.y, nm.col1.y, nm.col2.y, nm.col0.z, nm.col1.z, nm.col2.z }; glUniformMatrix3fv(Uniforms.NormalMatrix, 1, 0, &packed[0]); // Render the scene: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPatchParameteri(GL_PATCH_VERTICES, 3); glUniform3f(Uniforms.AmbientMaterial, 0.04f, 0.04f, 0.04f); glUniform3f(Uniforms.DiffuseMaterial, 0, 0.75, 0.75); glDrawElements(GL_PATCHES, IndexCount, GL_UNSIGNED_INT, 0); }
static void LoadUniforms(GLuint program) { GLint modelview = glGetUniformLocation(program, "Modelview"); if (modelview > -1) { glUniformMatrix4fv(modelview, 1, 0, &ModelviewMatrix.col0.x); } GLint normalMatrix = glGetUniformLocation(program, "NormalMatrix"); if (normalMatrix > -1) { Matrix3 nm = M3Transpose(M4GetUpper3x3(ModelviewMatrix)); float packed[9] = { nm.col0.x, nm.col1.x, nm.col2.x, nm.col0.y, nm.col1.y, nm.col2.y, nm.col0.z, nm.col1.z, nm.col2.z }; glUniformMatrix3fv(normalMatrix, 1, 0, &packed[0]); } GLint projection = glGetUniformLocation(program, "Projection"); if (projection > -1) { glUniformMatrix4fv(projection, 1, 0, &ProjectionMatrix.col0.x); } GLint size = glGetUniformLocation(program, "Size"); if (size > -1) { glUniform2f(size, PEZ_VIEWPORT_WIDTH, PEZ_VIEWPORT_HEIGHT); } GLint diffuseMaterial = glGetUniformLocation(program, "DiffuseMaterial"); if (diffuseMaterial > -1) { glUniform3f(diffuseMaterial, 0, 0.75, 0.75); } GLint ambientMaterial = glGetUniformLocation(program, "AmbientMaterial"); if (ambientMaterial > -1) { glUniform3f(ambientMaterial, 0.04f, 0.04f, 0.04f); } GLint specularMaterial = glGetUniformLocation(program, "SpecularMaterial"); if (specularMaterial > -1) { glUniform3f(specularMaterial, 0.5f, 0.5f, 0.5f); } GLint shininess = glGetUniformLocation(program, "Shininess"); if (shininess > -1) { glUniform1f(shininess, 50); } GLint lightPosition = glGetUniformLocation(program, "LightPosition"); if (lightPosition > -1) { glUniform3f(lightPosition, 0.25, 0.25, 1); } }
void PezRender() { #define Instances 7 Matrix4 Model[Instances]; Model[0] = M4MakeRotationY(Globals.Theta); Model[1] = M4Mul(M4Mul( M4MakeTranslation((Vector3){0, 0, 0.6}), M4MakeScale(V3MakeFromScalar(0.25))), M4MakeRotationX(Pi/2) ); Model[2] = Model[3] = Model[4] = Model[1]; Model[1] = M4Mul(M4MakeRotationY(Globals.Theta), Model[1]); Model[2] = M4Mul(M4MakeRotationY(Globals.Theta + Pi/2), Model[2]); Model[3] = M4Mul(M4MakeRotationY(Globals.Theta - Pi/2), Model[3]); Model[4] = M4Mul(M4MakeRotationY(Globals.Theta + Pi), Model[4]); Model[5] = M4Mul(M4Mul( M4MakeScale(V3MakeFromScalar(0.5)), M4MakeTranslation((Vector3){0, 1.25, 0})), M4MakeRotationY(-Globals.Theta) ); Model[6] = M4Mul(M4Mul( M4MakeScale(V3MakeFromScalar(0.5)), M4MakeTranslation((Vector3){0, -1.25, 0})), M4MakeRotationY(-Globals.Theta) ); Vector3 LightPosition = {0.5, 0.25, 1.0}; // world space Vector3 EyePosition = {0, 0, 1}; // world space Matrix4 MVP[Instances]; Vector3 Lhat[Instances]; Vector3 Hhat[Instances]; for (int i = 0; i < Instances; i++) { Matrix4 mv = M4Mul(Globals.View, Model[i]); MVP[i] = M4Mul(Globals.Projection, mv); Matrix3 m = M3Transpose(M4GetUpper3x3(Model[i])); Lhat[i] = M3MulV3(m, V3Normalize(LightPosition)); // object space Vector3 Eye = M3MulV3(m, V3Normalize(EyePosition)); // object space Hhat[i] = V3Normalize(V3Add(Lhat[i], Eye)); } int instanceCount = Instances; MeshPod* mesh = &Globals.Cylinder; glBindFramebuffer(GL_FRAMEBUFFER, Globals.FboHandle); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glUseProgram(Globals.LitProgram); glUniform3f(u("SpecularMaterial"), 0.4, 0.4, 0.4); glUniform4f(u("FrontMaterial"), 0, 0, 1, 1); glUniform4f(u("BackMaterial"), 0.5, 0.5, 0, 1); glUniform3fv(u("Hhat"), Instances, &Hhat[0].x); glUniform3fv(u("Lhat"), Instances, &Lhat[0].x); glUniformMatrix4fv(u("ModelviewProjection"), Instances, 0, (float*) &MVP[0]); glBindVertexArray(mesh->FillVao); glDrawElementsInstanced(GL_TRIANGLES, mesh->FillIndexCount, GL_UNSIGNED_SHORT, 0, instanceCount); glUseProgram(Globals.SimpleProgram); glUniform4f(u("Color"), 0, 0, 0, 1); glUniformMatrix4fv(u("ModelviewProjection"), Instances, 0, (float*) &MVP[0]); glDepthMask(GL_FALSE); glBindVertexArray(mesh->LineVao); glDrawElementsInstanced(GL_LINES, mesh->LineIndexCount, GL_UNSIGNED_SHORT, 0, instanceCount); glDepthMask(GL_TRUE); glDisable(GL_DEPTH_TEST); glBindFramebuffer(GL_FRAMEBUFFER, 0); glUseProgram(Globals.QuadProgram); glBindTexture(GL_TEXTURE_2D, Globals.FboTexture); glBindVertexArray(Globals.Grid.FillVao); glDrawElements(GL_TRIANGLES, Globals.Grid.FillIndexCount, GL_UNSIGNED_SHORT, 0); if (1) { glUseProgram(Globals.GridProgram); glBindVertexArray(Globals.Grid.LineVao); glDrawElements(GL_LINES, Globals.Grid.LineIndexCount, GL_UNSIGNED_SHORT, 0); } glBindTexture(GL_TEXTURE_2D, 0); }