Некорректное наложение шейдеров OpenGl

202
31 мая 2017, 02:15

В написании шейдеров я ещё новичок - изучил на треть "Трёхмерная графика и язык программирования шейдеров" и недавно попытался реализовать шаблон для вершинного шейдера, возвращающий исходные данные, а уже на его основе создавать выполняющие полезную работу (например, освещение). Фрагментный же шейдер я решил уже научить простым изменением, вроде изменения цветового баланса всех пикселей. Я начал с того, что прописал простые классы для вершинного и фрагментного шейдера соотвественно:

        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);
}

Список мер, которые я пробовал:

  • Отключать один из двух шейдеров - работает точно так же;
  • Менять задний фон. Пробовал белый, чёрный, и рекомендуемый васильковый цвет, всё так же - ничего не видно, кроме собственно цвета фона.
  • Лог компиляции\линкования всегда пустой. Читал, что вроде так и должно быть в некоторых случаях при успешной компиляции...
  • Статус компиляции\линкования получаю через glGetObjectParameterivARB() (константы GL_OBJECT_COMPILE_STATUS_ARB и GL_OBJECT_LINK_STATUS_ARB соотвественно). Во всех случаях возвращает единицу (GL_TRUE).

    Используемый мной враппер - Tao Framework (C#).

    Заранее спасибо за любую помощь!
READ ALSO
Вычисления на GPU C#

Вычисления на GPU C#

Ради веселья начал искать числа Ферма, но скорость вычисления на процессоре меня не устраиваетУ меня есть метод, который возводит value в степень...

423
Как оптимизировать код

Как оптимизировать код

Имею следующее одоробло:

269
парсер сайтов на php

парсер сайтов на php

всем привет!

354
Как использовать Twig

Как использовать Twig

У меня небольшой проект (mvc,OOP)Покажите пожалуйста как правильно подключать Twig и как его использовать в controller

359