Главная » Статьи » » -=Програмирование=-

Уроки по програмированию в С+ OpenGL_GLSL часть первая.
\-Базовые знания
    \- Шейдеры
        \-Урок1: Инициализация

Урок1: Инициализация

В OpenGL высокоуровневым шейдерным языком является GLSL, с ним и будем работать.
Объявления функций для работы с шейдерами содержаться в файле glext.h

    #include <gl/glext.h>

или для MacOS:

    #include <OpenGL/gl.h>

Для инициализируем расширение шейдеров будем использовать glh

    #define GLH_EXT_SINGLE_FILE
    #include <glh/glh_extensions.h>

*примечание: в заголовочном файле glh/glh_extensions.h уже содержится инклуд хеадера glext.h
*примечание2: GLH_EXT_SINGLE_FILE обязательно присутствует только в одном .cpp файле если
этот заголовочный файл используется в нескольких файлах для избежания множественных объявлений
одинаковых функций

Вот пример простого шейдера с подробными комментариями:

    #define GLH_EXT_SINGLE_FILE
    #include <glh/glh_extensions.h>

    GLhandleARB MyShader=0; //идентификатор шейдера

    GLvoid AddShader(GLenum type,const char *code, GLhandleARB programObject)
    {
        GLhandleARB object = glCreateShaderObjectARB(type); //создаем шейдерный объект

        glShaderSourceARB(object, 1, &code, NULL);//укзываем ему текст кода

        glCompileShaderARB(object); //компилируем

        GLint success=0;

        glGetObjectParameterivARB(object, GL_OBJECT_COMPILE_STATUS_ARB, &success);

        if(!success) //вывод ошибок, возникающих при неудачной компиляции
        {
            GLint length;
            glGetObjectParameterivARB(object, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);

            GLbyte*buf = new GLbyte[length];

            glGetInfoLogARB(object, length, &length, (GLcharARB*)buf);

            printf("Can`t compile shader (AddShader func)\n %s shader error: \n%s\n",
                (type == GL_FRAGMENT_SHADER_ARB) ? "fragment" : "vertex",
                buf);

            delete []buf;

            return;
        }

        glAttachObjectARB(programObject, object);
        glDeleteObjectARB(object);


        glLinkProgramARB(MyShader);

        //проверка успешности предыдущей операции
        glGetObjectParameterivARB(MyShader, GL_OBJECT_LINK_STATUS_ARB, &success);
        if(!success)
            return;

        glValidateProgramARB(ShaderProg);

        glGetObjectParameterivARB(MyShader, GL_OBJECT_VALIDATE_STATUS_ARB, &success);
        if(!success)
            return;

    }

    GLvoid AddMyShader()
    {

        //Инициализация необходимых расширений при помощи glh:

         if(!glh_init_extensions("GL_VERSION_1_2 GL_ARB_shader_objects"
        "GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_fragment_shader"))
             return;

        MyShader=glCreateProgramObjectARB(); //Создаем в памяти объект-идентификатор шейдера

        if(!MyShader)
            return;

        //Добавляем пустой вершинный шейдер, который только осуществляет трансформацию вершины
        AddShader(GL_VERTEX_SHADER_ARB,        "void main(void)"
                            "{"
                            "    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;"
                            "}", MyShader);

        //И пустой фрагментный шейдер, который задает каждому пикселю красный цвет
        AddShader(GL_FRAGMENT_SHADER_ARB,    "void main(void)"
                            "{"
                            "    gl_FragColor =vec4(1.0,0.0,0.0,1.0);"
                            "}", MyShader);

        glUseProgramObjectARB(0); //переключение текущего использованного шейдера на никакой

    }



Источник:
Категория: -=Програмирование=- | Добавил: spirit (15.08.2008) | Автор:
Просмотров: 1084 | Комментарии: 1 | Рейтинг: 0.0/0 |

Всего комментариев: 1
1 ALIVE  
0
Полностью с Вами согласна, примерно неделю назад написала про этоже в своем блоге! Представляете :) я хотел спросить, может ссылками обменяемся? e-mail в комментарии.


Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Форма входа

Категории каталога
-=SEO=- [8]
Раскрутка сайта в поисковиках
-=Дизайн=- [3]
Статьи по дизайну
-=CMS=- [3]
Статьи по работе с CMS
-=Програмирование=- [7]
Статьи по WEB и OS програмированию

Поиск