示例#1
0
    def setDefaultUniformBindings(shaderProgram):
        assert glGetIntegerv(GL_CURRENT_PROGRAM) == shaderProgram

        glUniform1i(
            lu.getUniformLocationDebug(shaderProgram, "diffuse_texture"),
            ObjModel.TU_Diffuse)
        glUniform1i(
            lu.getUniformLocationDebug(shaderProgram, "opacity_texture"),
            ObjModel.TU_Opacity)
        glUniform1i(
            lu.getUniformLocationDebug(shaderProgram, "specular_texture"),
            ObjModel.TU_Specular)
        glUniform1i(
            lu.getUniformLocationDebug(shaderProgram, "normal_texture"),
            ObjModel.TU_Normal)
示例#2
0
    def render(self, shaderProgram=None, renderFlags=None, transforms={}):
        if not renderFlags:
            renderFlags = self.RF_All

        if not shaderProgram:
            shaderProgram = self.defaultShader

        # Filter chunks based of render flags
        chunks = [ch for ch in self.chunks if ch[3] & renderFlags]

        glBindVertexArray(self.vertexArrayObject)
        glUseProgram(shaderProgram)

        # define defaults (identity)
        defaultTfms = {
            #            "modelToClipTransform" : lu.Mat4(),
            #            "modelToViewTransform" : lu.Mat4(),
            #            "modelToViewNormalTransform" : lu.Mat3(),
        }
        # overwrite defaults
        defaultTfms.update(transforms)
        # upload map of transforms
        for tfmName, tfm in defaultTfms.items():
            loc = lu.getUniformLocationDebug(shaderProgram, tfmName)
            tfm._set_open_gl_uniform(loc)

        previousMaterial = None
        for material, chunkOffset, chunkCount, renderFlags in chunks:
            # as an optimization we only do this if the material has changed between chunks.
            # for more efficiency still consider sorting chunks based on material (or fusing them?)
            if material != previousMaterial:
                previousMaterial = material
                if self.overrideDiffuseTextureWithDefault:
                    bindTexture(self.TU_Diffuse, self.defaultTextureOne,
                                self.defaultTextureOne)
                else:
                    bindTexture(self.TU_Diffuse,
                                material["texture"]["diffuse"],
                                self.defaultTextureOne)
                bindTexture(self.TU_Opacity, material["texture"]["opacity"],
                            self.defaultTextureOne)
                bindTexture(self.TU_Specular, material["texture"]["specular"],
                            self.defaultTextureOne)
                bindTexture(self.TU_Normal, material["texture"]["normal"],
                            self.defaultNormalTexture)
                # TODO: can I do uniform buffers from python (yes, I need to use that struct thingo!)
                #uint32_t matUniformSize = sizeof(MaterialProperties_Std140);
                #glBindBufferRange(GL_UNIFORM_BUFFER, UBS_MaterialProperties, m_materialPropertiesBuffer, (uint32_t)chunk.material->offset * matUniformSize, matUniformSize);
                # TODO: this is very slow, it should be packed into an uniform buffer as per above!
                for k, v in material["color"].items():
                    glUniform3fv(
                        lu.getUniformLocationDebug(shaderProgram,
                                                   "material_%s_color" % k), 1,
                        v)
                glUniform1f(
                    lu.getUniformLocationDebug(shaderProgram,
                                               "material_specular_exponent"),
                    material["specularExponent"])
                glUniform1f(
                    lu.getUniformLocationDebug(shaderProgram,
                                               "material_alpha"),
                    material["alpha"])

            glDrawArrays(GL_TRIANGLES, chunkOffset, chunkCount)

        glUseProgram(0)