И.В. Дикан, Ю.С. Белов
6
// объявление вертексного и фрагментного шейдера
string vs = `#version 330
// переменная для передачи текстурных координат в
фрагментный шейдер
out vec2 fs_TexCoord;
layout(location = 0) in vec3 vs_Position; // координа-
ты
layout(location = 1) in vec2 vs_TexCoord; // текстур-
ные координаты
uniform mat4 vs_Model; // матрица модели
uniform mat4 vs_ViewProj; // матрица камеры вместе с
проекцией
void main() {
// записываем текстурные координаты для фрагментного
шейдера
fs_TexCoord = vs_TexCoord;
vec4 v = vs_Model * vec4(vs_Position, 1.0); //
трансформируем вершину
gl_Position = vs_ViewProj * v; // записываем результат
}
`, fs = `#version 330
in vec2 fs_TexCoord;
uniform sampler2D fs_Texture;
void main() {
gl_FragColor = texture(fs_Texture, fs_TexCoord); //
выборка из текстуры
}
`;
// создание шейдерной программы
auto prog = CreateProgram();
// проверка на ошибки
prog || throwError(`can't create shader program`);
// очистка ресурсов в случае неудачи
scope(failure)
DeleteProgram(prog)
// создание вертексного шейдера
auto vs = CreateShader(VERTEX_SHADER);
vs || throwError(`can't create vertex shader`);
// удаление шейдера после успешного выхода из функции
scope(exit)
DeleteShader(vs);
// создание фрагментного шейдера
auto fs = CreateShader(FRAGMENT_SHADER);
fs || throwError(`can't create fragment shader`);
scope(exit)
DeleteShader(fs);
// загрузка исходного кода
ShaderSource(vs, 1, vs.ptr, null);
// компиляция