Ejemplo n.º 1
0
            public static GlUniformBlockBinding Bind(int programId, string blockName)
            {
                GlUniformBlockBinding binding;

                // Get the block index
                var uniformBlockIndex = GL.GetUniformBlockIndex(programId, blockName);

                GlDebug.ThrowIfGlError("getting uniform block index");
                if (uniformBlockIndex == (int)All.InvalidIndex)
                {
                    throw new ArgumentException($"Uniform block '{blockName}' not found.", nameof(blockName));
                }

                // Check if this block already has an assigned binding point.
                GL.GetActiveUniformBlock(programId, uniformBlockIndex, ActiveUniformBlockParameter.UniformBlockBinding, out int bindingPointIndex);
                GlDebug.ThrowIfGlError("getting uniform block binding");

                if (bindingPointIndex != 0)
                {
                    // Block already has a binding (might be specified in the shader), so..

                    // If we've already created a binding ref for this block index, use that.
                    // Otherwise create a new one.
                    if (!BindingsByBindingPoint.TryGetValue(bindingPointIndex, out binding))
                    {
                        binding = new GlUniformBlockBinding(bindingPointIndex, blockName);
                    }
                }
                else
                {
                    // Block doesn't already have a binding, so..

                    // If we've already created a binding point for this block name, use that.
                    // Otherwise assign a brand new one.
                    if (!BindingsByBlockName.TryGetValue(blockName, out binding))
                    {
                        // TODO: Not right. should also skip bindings already in use in OpenGL (because theyre specified in shaders)
                        // that we aren't aware of yet. might be better to not maintain a record ourselves and always just query opengl
                        int firstUnusedBindingPoint = 1;
                        while (BindingsByBindingPoint.ContainsKey(firstUnusedBindingPoint))
                        {
                            firstUnusedBindingPoint++;
                        }

                        binding = new GlUniformBlockBinding(firstUnusedBindingPoint, blockName);
                    }

                    // Bind this block to the binding point
                    GL.UniformBlockBinding(programId, uniformBlockIndex, binding.BindingPoint);
                    GlDebug.ThrowIfGlError("setting uniform block binding");
                }

                return(binding);
            }
Ejemplo n.º 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GlUniformBlockBindingRef"/> class.
 /// </summary>
 /// <param name="programId"></param>
 /// <param name="blockName"></param>
 public GlUniformBlockBindingRef(int programId, string blockName)
 {
     binding = GlUniformBlockBinding.Bind(programId, blockName);
     binding.Use();
 }