def setCommonUniforms(self, shader, view, modelToWorldTransform): # Concatenate the transformations to take vertices directly from model space to clip space modelToClipTransform = view.viewToClipTransform * view.worldToViewTransform * modelToWorldTransform # Transform to view space from model space (used for the shading) modelToViewTransform = view.worldToViewTransform * modelToWorldTransform # Transform to view space for normals, need to use the inverse transpose unless only rigid body & uniform scale. modelToViewNormalTransform = lu.inverse( lu.transpose(lu.Mat3(modelToViewTransform))) # Set the standard transforms, these vary per object and must be set each time an object is drawn (since they have different modelToWorld transforms) lu.setUniform(shader, "modelToClipTransform", modelToClipTransform) lu.setUniform(shader, "modelToViewTransform", modelToViewTransform) lu.setUniform(shader, "modelToViewNormalTransform", modelToViewNormalTransform) # These transforms are the same for the current view and could be set once for all the objects lu.setUniform(shader, "worldToViewTransform", view.worldToViewTransform) lu.setUniform(shader, "viewToClipTransform", view.viewToClipTransform) # Lighting parameters as could these viewSpaceLightPosition = lu.transformPoint(view.worldToViewTransform, g_sunPosition) lu.setUniform(shader, "viewSpaceLightPosition", viewSpaceLightPosition) lu.setUniform(shader, "globalAmbientLight", g_globalAmbientLight) lu.setUniform(shader, "sunLightColour", g_sunLightColour) lu.bindTexture(g_TU_shadow, g_shadowTexId) lu.setUniform(shader, "shadowMapTexture", g_shadowTexId)
def render(self, view, renderingSystem): glUseProgram(self.shader) renderingSystem.setCommonUniforms(self.shader, view, lu.Mat4()) lu.setUniform(self.shader, "terrainHeightScale", self.heightScale) lu.setUniform(self.shader, "terrainTextureXyScale", self.textureXyScale) xyNormScale = 1.0 / (vec2(self.imageWidth, self.imageHeight) * self.xyScale) lu.setUniform(self.shader, "xyNormScale", xyNormScale) xyOffset = -(vec2(self.imageWidth, self.imageHeight) + vec2(1.0)) * self.xyScale / 2.0 lu.setUniform(self.shader, "xyOffset", xyOffset) #TODO 1.4: Bind the grass texture to the right texture unit, hint: lu.bindTexture loc = glGetUniformLocation(self.shader, "someTexture") glUniform1i(loc, 0) lu.bindTexture(loc, glGenTextures(1)) if self.renderWireFrame: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glLineWidth(1.0) glBindVertexArray(self.vertexArrayObject) glDrawElements(GL_TRIANGLES, len(self.terrainInds), GL_UNSIGNED_INT, None) if self.renderWireFrame: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) glBindVertexArray(0) glUseProgram(0)
def render(self, view, renderingSystem): glUseProgram(self.shader) renderingSystem.setCommonUniforms(self.shader, view, lu.Mat4()) lu.setUniform(self.shader, "terrainHeightScale", self.heightScale) lu.setUniform(self.shader, "terrainTextureXyScale", self.textureXyScale) xyNormScale = 1.0 / (vec2(self.imageWidth, self.imageHeight) * self.xyScale) lu.setUniform(self.shader, "xyNormScale", xyNormScale) xyOffset = -(vec2(self.imageWidth, self.imageHeight) + vec2(1.0)) * self.xyScale / 2.0 lu.setUniform(self.shader, "xyOffset", xyOffset) #TODO 1.4: Bind the grass texture to the right texture unit, hint: lu.bindTexture lu.bindTexture(self.TU_Grass, self.grassTexture) lu.setUniform(self.shader, "grassTexture", self.TU_Grass) # 2.1 # High lu.bindTexture(self.TU_High, self.highTexture) lu.setUniform(self.shader, "highTexture", self.TU_High) # Steep lu.bindTexture(self.TU_Steep, self.steepTexture) lu.setUniform(self.shader, "steepTexture", self.TU_Steep) # Road lu.bindTexture(self.TU_Road, self.roadTexture) lu.bindTexture(self.TU_Map, self.mapTexture) lu.setUniform(self.shader, "roadTexture", self.TU_Road) lu.setUniform(self.shader, "mapTexture", self.TU_Map) if self.renderWireFrame: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glLineWidth(1.0) glBindVertexArray(self.vertexArrayObject) glDrawElements(GL_TRIANGLES, len(self.terrainInds), GL_UNSIGNED_INT, None) if self.renderWireFrame: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) glBindVertexArray(0) glUseProgram(0)
def render(self, view, renderingSystem, depthMap): glUseProgram(self.shader) renderingSystem.setCommonUniforms(self.shader, view, lu.Mat4()) lu.setUniform(self.shader, "terrainHeightScale", self.heightScale) lu.setUniform(self.shader, "terrainTextureXyScale", self.textureXyScale) xyNormScale = 1.0 / (vec2(self.imageWidth, self.imageHeight) * self.xyScale) lu.setUniform(self.shader, "xyNormScale", xyNormScale) xyOffset = -(vec2(self.imageWidth, self.imageHeight) + vec2(1.0)) / 2.0 lu.setUniform(self.shader, "xyOffset", xyOffset) lu.setUniform(self.shader, "lightPOVTransform", view.depthMVPTransform) #depthTexture binding for use in terrain frag shader #lu.bindTexture(shadow.TU_depthTexture, depthMap) #lu.setUniform(self.shader, "shadowMapTexture", shadow.TU_depthTexture) #FINISH HERE #TODO 1.4: Bind the grass texture to the right texture unit, hint: lu.bindTexture lu.bindTexture(self.TU_Grass, self.terrainTexId) lu.bindTexture(self.TU_high, self.highTexId) lu.bindTexture(self.TU_road, self.roadTexId) lu.bindTexture(self.TU_steep, self.steepTexId) lu.bindTexture(self.TU_map, self.terrainDataSampleTexId) #bind specs lu.bindTexture(self.TU_spec_grass, self.specGrassTexId) lu.bindTexture(self.TU_spec_high, self.specHighTexId) lu.bindTexture(self.TU_spec_road, self.specRoadTexId) lu.bindTexture(self.TU_spec_steep, self.specSteepTexId) #set uniform specs lu.setUniform(self.shader, "specularGrassTexture", self.TU_spec_grass) lu.setUniform(self.shader, "specularHighTexture", self.TU_spec_high) lu.setUniform(self.shader, "specularRoadTexture", self.TU_spec_road) lu.setUniform(self.shader, "specularSteepTexture", self.TU_spec_steep) # lu.setUniform(self.shader, "terrainTexture", self.TU_Grass) lu.setUniform(self.shader, "highTexture", self.TU_high) lu.setUniform(self.shader, "roadTexture", self.TU_road) lu.setUniform(self.shader, "steepTexture", self.TU_steep) lu.setUniform(self.shader, "terrainDataSample", self.TU_map) if self.renderWireFrame: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glLineWidth(1.0) glBindVertexArray(self.vertexArrayObject) glDrawElements(GL_TRIANGLES, len(self.terrainInds), GL_UNSIGNED_INT, None) if self.renderWireFrame: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) glBindVertexArray(0) glUseProgram(0)