В написании шейдеров я ещё новичок - изучил на треть "Трёхмерная графика и язык программирования шейдеров" и недавно попытался реализовать шаблон для вершинного шейдера, возвращающий исходные данные, а уже на его основе создавать выполняющие полезную работу (например, освещение). Фрагментный же шейдер я решил уже научить простым изменением, вроде изменения цветового баланса всех пикселей. Я начал с того, что прописал простые классы для вершинного и фрагментного шейдера соотвественно:
public class VertexShader
{
private int id;
public int ID { get { return id; } }
public VertexShader(string[] code)
{
id = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
glShaderSource(id, 1, code, IntPtr.Zero);
glCompileShaderARB(id);
int complete;
glGetObjectParameterivARB(id, GL_OBJECT_COMPILE_STATUS_ARB, out complete);
if (complete == GL_FALSE)
Environment.Exit(0);
}
}
public class FragmentShader
{
private int id;
public int ID { get { return id; } }
public FragmentShader(string[] code)
{
id = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
glShaderSource(id, 1, code, IntPtr.Zero);
glCompileShaderARB(id);
int complete;
glGetObjectParameterivARB(id, GL_OBJECT_COMPILE_STATUS_ARB, out complete);
if (complete == GL_FALSE)
Environment.Exit(0);
}
}
Я насторожился уже на этом этапе: даже при грубом нарушении синтаксиса (в данном случае я попробовал убрать функцию main()) компилятор никаких ошибок не выдаёт (учтите, я пытался проследить ошибки и с помощью исключений, а не закрытия приложения).
Далее я написал класс для программы:
public class ShaderProgram
{
private int id;
public int ID { get { return id; } }
public ShaderProgram(VertexShader vertshader, FragmentShader fragshader)
{
id = glCreateProgramObjectARB();
glAttachObjectARB(id, vertshader.ID);
glAttachObjectARB(id, fragshader.ID);
glLinkProgramARB(id);
int complete;
glGetObjectParameterivARB(id, GL_OBJECT_LINK_STATUS_ARB, out complete);
if (complete == GL_FALSE)
{
Environment.Exit(0);
}
}
}
При активации этой программы функцией glUseProgramObjectARB() все полигоны начисто пропадают. Скорее всего, дело в коде, несмотря на то, что я пытался донельзя его упростить, и пробовал копипастить из разных источников.
Вот мой код для шейдеров:
Вершинный:
#version 330
layout(location = 0) in vec3 vertexPoc;
void main() {
gl_Position.xyz = vertexPos;
gl_Position.w = 1.0;
}
Фрагментный:
#version 330
out vec4 color;
void main() {
color = vec4(1.0, 1.0, 1.0, 1.0);
}
Список мер, которые я пробовал:
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Ради веселья начал искать числа Ферма, но скорость вычисления на процессоре меня не устраиваетУ меня есть метод, который возводит value в степень...
У меня небольшой проект (mvc,OOP)Покажите пожалуйста как правильно подключать Twig и как его использовать в controller