Контекст рендера

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