Контекст рендера
GLRenderContext
Основной класс для создания и управления GPU-ресурсами.
// Получение контекста
var context = Igdrasil.Context; // IRenderContext
// Использование
var shader = context.CreateShader(shaders);
var texture = context.CreateTexture(image);
var vbo = context.CreateVertexBuffer<Vertex>(BufferTargetARB.ArrayBuffer);
Создание ресурсов
Шейдеры
// Из исходного текста
var shader = context.CreateShader(new List<ShaderScript>
{
new(ShaderType.Vertex, vertexSource),
new(ShaderType.Fragment, fragmentSource)
});
// Из скомпилированной программы (быстрее)
var compiled = GetCachedShaderBinary();
var shader = context.CreateShader(new CompiledShaderProgram
{
Binary = compiled.Data,
Format = compiled.Format
});
Текстуры
// Из RawImage
var image = new RawImage(width, height, pixelData);
var texture = context.CreateTexture(image);
// С параметрами
image.Parameters = new[]
{
new TexParameter(TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear),
new TexParameter(TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear),
new TexParameter(TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat),
new TexParameter(TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat)
};
var texture = context.CreateTexture(image);
Буферы вершин
// Массив вершин
var vbo = context.CreateVertexBuffer<Vertex>(BufferTargetARB.ArrayBuffer);
vbo.Load(vertices, BufferUsageARB.StaticDraw);
// Индексы
var ebo = context.CreateVertexBuffer<uint>(BufferTargetARB.ElementArrayBuffer);
ebo.Load(indices, BufferUsageARB.StaticDraw);
Атрибуты вершин
var vao = context.CreateVertexAttributes();
vao.Bind();
// Описание формата вершины
vao.AddAttribute(0, 3, VertexAttribPointerType.Float, false, 32, 0); // позиция (xyz)
vao.AddAttribute(1, 2, VertexAttribPointerType.Float, false, 32, 12); // текстура (uv)
vao.AddAttribute(2, 3, VertexAttribPointerType.Float, false, 32, 20); // нормаль (xyz)
vao.EnableAttribute(0);
vao.EnableAttribute(1);
vao.EnableAttribute(2);
Управление состоянием
Очистка экрана
context.ClearColor(new FVector4(0.1f, 0.1f, 0.1f, 1f));
context.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
Текстурные блоки
// Активировать Texture0
context.SetActiveTexture(TextureUnit.Texture0);
texture.Bind();
// Активировать Texture1 и привязать другую текстуру
context.SetActiveTexture(TextureUnit.Texture1);
normalMap.Bind();
Режим растеризации
// Каркасный режим (для отладки)
context.SetPolygonMode(TriangleFace.FrontAndBack, PolygonMode.Line);
// Обычная заливка
context.SetPolygonMode(TriangleFace.FrontAndBack, PolygonMode.Fill);
Смешивание (Blending)
// Для прозрачности
context.SetBlend(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
// Для аддитивного смешивания (свечение)
context.SetBlend(BlendingFactor.One, BlendingFactor.One);
Отрисовка
DrawArrays (без индексов)
shader.Apply();
vao.Bind();
context.DrawArrays(PrimitiveType.Triangles, 0, vertexCount);
DrawElements (с индексами)
shader.Apply();
vao.Bind();
ebo.Bind();
context.DrawElements(PrimitiveType.Triangles, 0, indexCount, DrawElementsType.UnsignedInt);
Фреймбуферы
Отрисовка в текстуру
// Создаём текстуру и добавляем в буфер
var renderTarget = context.CreateTexture(targetImage);
var shaderBuffer = context.GetTextureBuffer();
shaderBuffer.Add("renderTarget", renderTarget);
// Создаём фреймбуфер
var framebuffer = context.CreateFramebuffer("renderTarget");
if (framebuffer != null)
{
framebuffer.Bind();
// отрисовка в текстуру
}
Экранный фреймбуфер
// ID 0 = экран
var screenFB = context.CreateFramebuffer(0, () => new IVector2(width, height));
screenFB.Bind();
// отрисовка на экран
Буферы ресурсов
var shaderBuffer = context.GetShaderBuffer();
var textureBuffer = context.GetTextureBuffer();
// Добавить
shaderBuffer.Add("myShader", shader);
textureBuffer.Add("albedo", texture);
// Получить
var s = shaderBuffer["myShader"];
var t = textureBuffer["albedo"];
// Проверить наличие
if (shaderBuffer.Contains("myShader"))
{
// используем
}
Версия: 1.0