public void UpdateBufferForBlock(int program, string nameBlock)
{
int index_SLI = GL.GetUniformBlockIndex(program, nameBlock);
if (index_SLI != -1)
{
GL.GetActiveUniformBlock(program, index_SLI, ActiveUniformBlockParameter.UniformBlockDataSize, out blockSizeLightInfo);
byte[] blockBuffer = new byte[blockSizeLightInfo];
string[] names = { nameBlock + ".position_lgh", nameBlock + ".intensity_lgh", nameBlock + ".direction_lgh", nameBlock + ".exponent_lgh", nameBlock + ".cutoff_lgh" };
int[] indices = new int[5];
GL.GetUniformIndices(program, 5, names, indices);
int[] offset = new int[5];
GL.GetActiveUniforms(program, 5, indices, ActiveUniformParameter.UniformOffset, offset);
float[] position_lgh = { Position.X, Position.Y, Position.Z, 0.0f };
float[] intensity_lgh = { DiffusionIntensity.X, DiffusionIntensity.Y, DiffusionIntensity.Z }; //интенсивность света
float[] direction_lgh = { LightVecNormalized.X, LightVecNormalized.Y, LightVecNormalized.Z }; //направление света
float[] exponent = { 1.0f }; // Экспанента углового ослабления света
float[] cutoff = { 30f }; //угол отсечения
Buffer.BlockCopy(position_lgh, 0, blockBuffer, offset[0], position_lgh.Length * sizeof(float));
Buffer.BlockCopy(intensity_lgh, 0, blockBuffer, offset[1], intensity_lgh.Length * sizeof(float));
Buffer.BlockCopy(direction_lgh, 0, blockBuffer, offset[2], direction_lgh.Length * sizeof(float));
Buffer.BlockCopy(exponent, 0, blockBuffer, offset[3], exponent.Length * sizeof(float));
Buffer.BlockCopy(cutoff, 0, blockBuffer, offset[4], cutoff.Length * sizeof(float));
GL.BindBuffer(BufferTarget.UniformBuffer, uboLightInfo);
GL.BufferSubData(BufferTarget.UniformBuffer, (IntPtr)0, blockSizeLightInfo, blockBuffer);
}
}