ПрограммированиеФорумГрафика

Не передаются varying переменные (2 стр)

Страницы: 1 2 3 Следующая »
#15
19:33, 13 окт 2009

X512
А в чём там разница? Я просто слышал, что он в промежуточный код компилит. Но сам на нём ничего почти не писал, поэтому не в курсе подробностей. :)

#16
19:35, 13 окт 2009

у меня получается черный объект. Уважаемый K.V. а вы на C# делаете? С# - потому что начал работать на нем. Но чувствую сейчас буду переходить на Qt, чтобы заработали шейдеры.

#17
19:37, 13 окт 2009

K.V.
> Я просто слышал, что он в промежуточный код компилит.
А потом ещё и в байт код динамичеки компилит(бредовая схема, если можно сразу в байт код компилить).

altk
А ничего вроди glColor3f(0,0,0) не было?

#18
19:39, 13 окт 2009

Не, я на C++. А Qt это оконная библиотека, это же не язык программирования. Для графики тебе будет достаточно C++ и нескольких десятков строк на WinAPI, а насчёт Qt не знаю, стоит ли... Хотя слышал о нём хвалебные отзывы. Хотя бы потому что он кроссплатформенный.

#19
19:40, 13 окт 2009

X512
Мудрёная система. :) А насчёт glColor3f, шейдер разве не должен заменить собой эту часть конвейера? O_o Я конечно не уверен, но по-моему glColor ему должно быть безразлично. :)

#20
19:40, 13 окт 2009

K.V.
> Хотя бы потому что он кроссплатформенный.
Кто мешает исрользовать SDL?

#21
19:44, 13 окт 2009

Нет. А вот пример, который даёт красный объект:

private string[] vertex_shader =
        {
        "varying vec4 color2;",
        "void main() {",  

            "color2=vec4(1.0,1.0,0.0,1.0);",
        "gl_Position = ftransform();",            
          "}"
        };

        private string[] fragment_shader =
        {

            "varying vec4 color2; void main(){color2=vec4(1.0,0.0,0.0,1.0); gl_FragColor=color2;}"
        };

Результат красный объект.

private string[] vertex_shader =
        {
        "varying vec4 color2;",

        "varying vec3 normal,lightDir,halfVector;", */ 
        "void main() {",  
            "color2=vec4(1.0,1.0,0.0,1.0);",
        "gl_Position = ftransform();",            
          "}"
        };

        private string[] fragment_shader =
        {
            "varying vec4 color2; void main(){gl_FragColor=color2;}"
        };

Результат - черный объект. Вот теперь где ошибка?

#22
19:45, 13 окт 2009

X512
> Кто мешает исрользовать SDL?
А не знаю, я насчёт кроссплатформенности пока не особо парюсь, и не изучал эту тему. :)

#23
19:45, 13 окт 2009

А переходить на Qt - потому что уже пробовал свои силы в данной библиотеке, да и портирование программы думаю займет около дня, если не меньше.

#24
19:47, 13 окт 2009

altk
> Результат красный объект.
А должен быть жёлтый. :)

#25
19:51, 13 окт 2009

Вообще странно, почему первый пример вообще работает. Я до этого считал, что нельзя во фрагментном шейдере устанавливать значение varying-переменных. А второй у тебя везде не работает? В RenderMonkey проверял?

#26
19:57, 13 окт 2009

Render Monkty у меня не запускается - я так понимаю из-за Vista. Проверял у парня на ноуте - Render Monkey всё работает замечательно.

#27
19:59, 13 окт 2009

Ну значит дело не в шейдере. И вот, кстати, из учебника:
"Обычно вершинный шейдер устанавливает varying-переменную, а фрагментный шейдер её использует, не имея возможности изменить значение". Не знаю как у тебя это работает (пример с красным объектом), но теоретически это некорректно. :)

#28
20:02, 13 окт 2009

Я только сейчас подробно глянул твоё API. Какой кошмар!!! Ты зачем так делаешь? :) Поэтому ничего толком и не работает. Щас распишу как надо.

#29
20:10, 13 окт 2009

private void InitShaders()
        {
            // создаём объект вершинного шейдера
            vs_object = Gl.glCreateShader(Gl.GL_VERTEX_SHADER);
            // создаём объект фрагментного шейдера
            fs_object = Gl.glCreateShader(Gl.GL_FRAGMENT_SHADER);

            int[] status = new int[1];

            // компилим шейдеры и проверяем на наличие ошибок. в том примере, на основе которого я загружал шейдеры,
            // использовалась функция glGetObjectParameteriv вместо glGetShaderiv, но не знаю насколько это принципиально.
            Gl.glShaderSource(vs_object, vertex_shader.Length, vertex_shader, null);
            Gl.glCompileShader(vs_object);

            Gl.glGetObjectParameteriv(vs_object, Gl.GL_COMPILE_STATUS, status);
            if (status[0] != Gl.GL_TRUE)
                throw new Exception("Could not compile fragment shader");
           
            Gl.glShaderSource(fs_object, fragment_shader.Length, fragment_shader, null);
            Gl.glCompileShader(fs_object);

            Gl.glGetObjectParameteriv(fs_object, Gl.GL_COMPILE_STATUS, status);
            if (status[0] != Gl.GL_TRUE)
                throw new Exception("Could not compile fragment shader");

            // А вот программа тебе нужна всего одна, она и будет объединять эти два шейдера.
            program = Gl.glCreateProgram();
            Gl.glAttachShader(program, vs_object);
            Gl.glAttachShader(program, fs_object);

            // Теперь выполняем компоновку (примерно то же, что Build в компиляторе)
            Gl.glLinkProgram(program);

            // Тут можешь тоже проверить на успешность компоновки, иногда она выдаёт ошибки.
            // Только константа тут будет GL_OBJECT_LINK_STATUS_ARB и проверять надо будет объект program.
            //System.Diagnostics.Debug.WriteLine(string.Format("program={0}", fs_program));

        }
Вот примерно так. И потом где нужно использовать шейдер пишешь
Gl.glUseProgramObject(program);
А где не нужно
Gl.glUseProgramObject(0);
А закомментированная строка с System уж не знаю зачем, тебе виднее. :)

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.

Тема закрыта.