Уроки по програмированию в С+ 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
(03.09.2009 17:37)
0
Полностью с Вами согласна, примерно неделю назад написала про этоже в своем блоге! Представляете :) я хотел спросить, может ссылками обменяемся? e-mail в комментарии.
Добавлять комментарии могут только зарегистрированные пользователи.
[
Регистрация |
Вход ]
Форма входа
Категории каталога
Поиск