public static void SetMaterialPropertyUniforms(UniformBlock uniformBlock, Shader shader, Nud.Material mat) { // Skip expensive buffer updates for redundant value updates. if (mat.ShouldUpdateRendering) { foreach (var property in defaultValueByProperty) { MatPropertyShaderUniform(uniformBlock, mat, property.Key, property.Value); } mat.ShouldUpdateRendering = false; } // Always bind the uniform block because each polygon has its own uniform block. uniformBlock.BindBlock(shader, "MaterialProperties"); // Create some conditionals rather than using different shaders. var genericMaterial = new GenericMaterial(); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_softLightingParams", "hasSoftLight"); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_customSoftLightParams", "hasCustomSoftLight"); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_specularParams", "hasSpecularParams"); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_dualNormalScrollParams", "hasDualNormal"); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_normalSamplerAUV", "hasNrmSamplerAUV"); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_normalSamplerBUV", "hasNrmSamplerBUV"); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_finalColorGain", "hasFinalColorGain"); HasMatPropertyShaderUniform(genericMaterial, mat, "NU_effUniverseParam", "hasUniverseParam"); genericMaterial.SetShaderUniforms(shader); }
public void SetMaterialUniforms(Shader shader, Material previousMaterial) { // TODO: This code could be moved to the constructor. if (genericMaterial == null || shouldUpdateTextures) { genericMaterial = CreateGenericMaterial(); shouldUpdateTextures = true; } if (uniformBlock == null) { uniformBlock = new UniformBlock(shader, "MaterialParams") { BlockBinding = 1 }; SetMaterialParams(uniformBlock); } if (shouldUpdateUniformBlock) { SetMaterialParams(uniformBlock); shouldUpdateUniformBlock = false; } // This needs to be updated more than once. AddDebugParams(uniformBlock); // Update the uniform values. genericMaterial.SetShaderUniforms(shader, previousMaterial?.genericMaterial); uniformBlock.BindBlock(shader); }
public void Render(Camera camera, RSkeleton Skeleton = null) { Shader shader = ShaderContainer.GetCurrentRModelShader(); if (!shader.LinkStatusIsOk) { return; } shader.UseProgram(); SetRenderSettingsUniforms(shader); SetCameraUniforms(camera, shader); // Bones if (boneUniformBuffer != null) { boneUniformBuffer.BindBlock(shader); if (Skeleton != null) { boneBinds = Skeleton.GetAnimationTransforms(); } boneUniformBuffer.SetValues("transforms", boneBinds); } DrawMeshes(Skeleton, shader); }
public void BindingPointOne() { var uniformBlock = new UniformBlock(shader, "UniformBlockA") { BlockBinding = 1 }; uniformBlock.BindBlock(shader); int binding = GetBlockBinding("UniformBlockA"); Assert.AreEqual(uniformBlock.BlockBinding, binding); }
public void InvalidBlockName() { // Shouldn't throw exception. var e = Assert.ThrowsException <ArgumentException>(() => { var uniformBlock = new UniformBlock(shader, "memes") { BlockBinding = 0 }; uniformBlock.BindBlock(shader); }); Assert.AreEqual("uniformBlockName", e.ParamName); Assert.IsTrue(e.Message.Contains("memes is not an active uniform block in the specified shader.")); }