ShaderHandle
Идентификатор и контейнер UI-шейдеров, ссылающийся на путь к ресурсу или содержащий встроенный GLSL-код.
Архитектура и разрешение GLSL
ShaderHandle представляет шейдерный пайплайн видеокарты для команд DrawCommandType.SHADER и DrawScope#shader.
Два режима работы
- Идентификатор ресурса (
ShaderHandle.resource(id)): Ссылается на именованный ресурс шейдера (minecraft:rendertype_guiили шейдер мода). Бэкенд запрашивает зарегистрированныеShaderProviderдля загрузки исходного кода. - Встроенный GLSL-код (
ShaderHandle.source(...)илиfragmentSource(...)): Хранит строки vertex/fragment GLSL-шейдеров прямо в объекте для процедурных эффектов без необходимости создания отдельных файлов ресурсов.
Пайплайн исполнения шейдера
При вызове DrawScope#shader:
ShaderHandleуказывает исполняемую программу.ShaderUniformsпередаёт пользовательские uniforms (разрешение, время, цвета, координаты).ShaderDrawOptionsнастраивает блендинг и автоматические стандартные uniforms (SquareVertex).
Бэкенд компилирует и кэширует GLSL-программы по ключу id(), предотвращая повторную компиляцию между кадрами.
Процедурный радиальный градиент
// Встроенный fragment shader для пульсирующего портала
String glsl = """
#version 150
uniform vec2 u_resolution;
uniform float u_time;
out vec4 fragColor;
void main() {
vec2 st = gl_FragCoord.xy / u_resolution;
float dist = distance(st, vec2(0.5));
float pulse = 0.5 + 0.5 * sin(u_time * 3.0);
fragColor = vec4(0.2, 0.6, 1.0, (1.0 - smoothstep(0.1, 0.5, dist)) * pulse);
}
""";
ShaderHandle portalShader = ShaderHandle.fragmentSource("mod:portal_effect", glsl);
API
Фабричные методы
| Метод | Описание |
|---|---|
resource(String) |
Создаёт ShaderHandle, ссылающийся на внешний ресурс шейдера, разрешаемый через ShaderProviders. |
fragmentSource(String, String) |
Создаёт ShaderHandle со встроенным GLSL-кодом fragment shader. |
source(String, String, String) |
Создаёт ShaderHandle со встроенным GLSL-кодом для vertex и fragment шейдеров. |
ShaderHandle::resource(String)
Создать дескриптор ресурса
Создаёт ShaderHandle, ссылающийся на внешний ресурс шейдера, разрешаемый через ShaderProviders.
| Параметр | Тип | Описание |
|---|---|---|
id |
String |
Идентификатор ресурса шейдера или встроенной программы. |
Возвращает ShaderHandle: Новый дескриптор ShaderHandle на ресурс..
ShaderHandle::fragmentSource(String, String)
Создать со встроенным fragment кодом
Создаёт ShaderHandle со встроенным GLSL-кодом fragment shader.
| Параметр | Тип | Описание |
|---|---|---|
id |
String |
Идентификатор ресурса шейдера или встроенной программы. |
fragmentSource |
String |
GLSL-код фрагментного шейдера. |
Возвращает ShaderHandle: Новый ShaderHandle со встроенным fragment кодом..
ShaderHandle::source(String, String, String)
Создать с vertex и fragment кодом
Создаёт ShaderHandle со встроенным GLSL-кодом для vertex и fragment шейдеров.
| Параметр | Тип | Описание |
|---|---|---|
id |
String |
Идентификатор ресурса шейдера или встроенной программы. |
vertexSource |
String |
GLSL-код вершинного шейдера. |
fragmentSource |
String |
GLSL-код фрагментного шейдера. |
Возвращает ShaderHandle: Новый ShaderHandle с полным встроенным кодом..
Свойства и исходный код
| Метод | Описание |
|---|---|
id() |
Возвращает стабильный строковый идентификатор шейдера. |
vertexSource() |
Возвращает встроенный GLSL-код vertex shader или null. |
fragmentSource() |
Возвращает встроенный GLSL-код fragment shader или null. |
hasEmbeddedVertexSource() |
Возвращает true, если хэндл содержит встроенный vertex source. |
hasEmbeddedFragmentSource() |
Возвращает true, если хэндл содержит встроенный fragment source. |
copy() |
Создаёт независимую копию этого ShaderHandle. |
ShaderHandle::id()
Получить ID шейдера
Возвращает стабильный строковый идентификатор шейдера.
Возвращает String: Нормализованный ID шейдера..
ShaderHandle::vertexSource()
Получить vertex код
Возвращает встроенный GLSL-код vertex shader или null.
Возвращает String: Строка с GLSL vertex source либо null..
ShaderHandle::fragmentSource()
Получить fragment код
Возвращает встроенный GLSL-код fragment shader или null.
Возвращает String: Строка с GLSL fragment source либо null..
ShaderHandle::hasEmbeddedVertexSource()
Проверить наличие vertex кода
Возвращает true, если хэндл содержит встроенный vertex source.
Возвращает boolean: True, если vertex source присутствует..
ShaderHandle::hasEmbeddedFragmentSource()
Проверить наличие fragment кода
Возвращает true, если хэндл содержит встроенный fragment source.
Возвращает boolean: True, если fragment source присутствует..
ShaderHandle::copy()
Копировать ShaderHandle
Создаёт независимую копию этого ShaderHandle.
Возвращает ShaderHandle: Новый ShaderHandle с идентичными id и кодом..