/// <summary>
/// Initialize and setup uniform block's value.
/// </summary>
/// <param name="program"></param>
/// <returns></returns>
private UniformBufferPtr Initialize(ShaderProgram program)
{
if (glGetUniformBlockIndex == null)
{
glGetUniformBlockIndex = OpenGL.GetDelegateFor <OpenGL.glGetUniformBlockIndex>();
glGetActiveUniformBlockiv = OpenGL.GetDelegateFor <OpenGL.glGetActiveUniformBlockiv>();
}
uint uboIndex = glGetUniformBlockIndex(program.ProgramId, this.VarName);
var uboSize = new uint[1];
glGetActiveUniformBlockiv(program.ProgramId, uboIndex, OpenGL.GL_UNIFORM_BLOCK_DATA_SIZE, uboSize);
UniformBufferPtr result = null;
using (var buffer = new UniformBuffer <byte>(BufferUsage.StaticDraw, noDataCopyed: false))
{
byte[] bytes = this.value.ToBytes();
buffer.Create(bytes.Length);
unsafe
{
var array = (byte *)buffer.Header.ToPointer();
for (int i = 0; i < bytes.Length; i++)
{
array[i] = bytes[i];
}
}
result = buffer.GetBufferPtr() as UniformBufferPtr;
}
//glBindBufferBase(OpenGL.GL_UNIFORM_BUFFER, uboIndex, result.BufferId);
//glBindBufferBase(OpenGL.GL_UNIFORM_BUFFER, 0, result.BufferId);
//glUniformBlockBinding(program.ProgramId, uboIndex, 0);
result.Binding(program, uboIndex, 0);
result.Unbind();
return(result);
}