|
12.08.2013, 20:26
|
#1
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Code::Blocks + modern OpenGL
Таки намучал себе новый OpenGL к любимому C::B и хочу поделить своим опытом, вдруг у кого будут проблемы.
Мы будем работать с:
Code::Blocks
GLEW
GLFW
Для начала, если нету, качаем C::B с официального сайта. Запускаем, создаем пустой проект(File->New->Project->Empty project). C::B не закрываем, пусть висит.
Теперь качаем GLFW. Заходим на официальный сайт(см. выше), Download->Binaries for 32(64)-bit Windows Download. Качаем, распаковываем в любую папку.
Теперь качаем GLEW. Заходим на главную и качаем не Bin а Source. Авторы не раскрыли, что ещё кроме их либ нужно подключить, чтобы GLEW заработал, поэтому нам придется подрубить его вручную. Тоже распаковываем это дело в любую папку.
Разворачиваем наш C::B. Можете настроить его под проект, либо же установить глобальные настройки, дело ваше. Я расскажу как настроить под наш текущий проект. Слева, во вкладке Workspace, будет значок C::B с именем вашего проекта. Правая кнопка мыши->Build options->Linker settings. В other linker options пишем следующую строку:
-lglfw3 -lopengl32 -lgdi32 -luser32 -lkernel32
Теперь идем в Search directories. Чтобы добавить новый путь, нажмите на кнопку Add.
Вкладка Compiler: здесь указываем пути к нашим include папкам библиотек. У меня получилось следующие:
D:\OGL\GLFW\include
D:\OGL\GLEW\inlcude
Вкладка Linker: здесь указываем пути к lib папке GLFW. У меня получилось следующие:
D:\OGL\GLFW\lib-mingw
Та-дам, мы настроили C::B на работу. Теперь создадим файл "main.cpp" в папке с нашим проектом и заполним его следующим кодом:
#define GLEW_STATIC #include <GL/glew.h> #include <GL/glew.c> #include <GLFW/glfw3.h> #include <iostream> int main(void) { GLFWwindow* window; if (!glfwInit()) return -1; window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } glfwMakeContextCurrent(window); GLenum err = glewInit(); if (GLEW_OK != err) std::cout<<"Error: "<<glewGetErrorString(err)<<std::endl; if (GLEW_VERSION_4_3) std::cout<<"WIN!"<<std::endl; GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); static const GLfloat g_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; GLuint vertexbuffer; glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); while (!glfwWindowShouldClose(window)) { glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
Нажимаем F9, видим белый треугольник и "WIN!" в консоли, радуемся тому, что у нас есть поддержка OpenGL 4.3 в отличном IDE - Code::Blocks.
Спасибо за внимание, надеюсь, кому-нибудь пригодится
Последний раз редактировалось Nikich, 13.08.2013 в 00:41.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Nikich за это полезное сообщение:
|
|
16.08.2013, 23:57
|
#2
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Выдает:
C:\Dev\CPP\GLEW\main.cpp|3|GL/glew.c: No such file or directory|
|
Эммм... Так куда его пихать?)
|
(Offline)
|
|
17.08.2013, 01:44
|
#3
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Проверь пути во вкладке Compiler, возможно не то указал.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.08.2013, 01:58
|
#4
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Сообщение от Nikich
Проверь пути во вкладке Compiler, возможно не то указал.
|
Все точно по инструкции. Где .c-файл должен быть?
|
(Offline)
|
|
17.08.2013, 02:07
|
#5
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Там же, где и glew.h .
|
(Offline)
|
|
17.08.2013, 02:12
|
#6
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Сообщение от Nikich
Там же, где и glew.h .
|
То есть его надо переместить в "c:\glew\include\"?
|
(Offline)
|
|
17.08.2013, 02:26
|
#7
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
В папку /include/GL.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.10.2013, 22:27
|
#8
|
Легенда
Регистрация: 14.10.2007
Сообщений: 3,878
Написано 2,012 полезных сообщений (для 5,072 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Глупый вопрос но все же задам его. Как добавить поддержку предыдущих версий GL?)
|
(Offline)
|
|
24.10.2013, 00:44
|
#9
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Использовать старые версии OGL. Нельзя совместить функционал и нового и старого в одном проекте, как я понимаю, ведь там совсем разные подходы.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.10.2013, 19:16
|
#10
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Какой самый правильным способ объединить несколько библиотек в одну DLL? Запихнуть все исходники в один и из него уже запилить DLL?
|
(Offline)
|
|
24.10.2013, 20:59
|
#11
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Какой самый правильным способ объединить несколько библиотек в одну DLL? Запихнуть все исходники в один и из него уже запилить DLL?
|
я делал так.
как показала практика - это самый удобный способ. Собирать статические либы в виде компонентов, или тем более длл-лок оказалось очень муторно. Да, увеличивается время компиляции и особенно время линковки, но зато настройки проекта можно менять очень быстро. Не собирая тыщи либ на каждый чих.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.10.2013, 01:21
|
#12
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Ещё один вопрос касательно создания библиотеки. Как сделать статичную либу, которая использует для своей работы другие статичные либы?
Для поддержки OGL, приходится использовать как минимум следующие флаги:"-lopengl32 -lgdi32 -luser32 -lkernel32". Поэтому, если либа работает с OGL, она должна включить в себя данные библиотеки, что делать она отказывается Как быть?
|
(Offline)
|
|
28.10.2013, 09:13
|
#13
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Сообщение от Nikich
Ещё один вопрос касательно создания библиотеки. Как сделать статичную либу, которая использует для своей работы другие статичные либы?
Для поддержки OGL, приходится использовать как минимум следующие флаги:"-lopengl32 -lgdi32 -luser32 -lkernel32". Поэтому, если либа работает с OGL, она должна включить в себя данные библиотеки, что делать она отказывается Как быть?
|
статически нельзя слинковать в библиотеку динамические библиотеки, какими является opengl32, glu, glut и т.д. либо смирись, либо компиль динамическую библиотеку. Ты должен понимать, что статическая библиотека, это архив с отдельно откомпилированными исходными файлами c, cpp (единицами трансляции), когда ты линкуешь ее в проект происходит тоже самое если бы использовал исходники, только эти уже заранее откомпилированы. Вот динамическая библиотека наоборот, компилируется и линкуется с другими библиотеками так же как и exe файл. Поэтому при подключении динамической библиотеки не требуется еще указывать кучу зависимых библиотек, но стоит учесть что dll компоненты которые она использует в системе необходимы быть
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
28.10.2013, 20:27
|
#14
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Милый Linux умеет объединять, разбивая статик либы на объекты, а потом компонуя обратно в либу. Также вычитал, что и студия умеет. GCC же, видимо, соснул
|
(Offline)
|
|
28.10.2013, 23:40
|
#15
|
Мастер
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений (для 631 пользователей)
|
Ответ: Code::Blocks + modern OpenGL
Сообщение от Nikich
Милый Linux умеет объединять, разбивая статик либы на объекты, а потом компонуя обратно в либу. Также вычитал, что и студия умеет. GCC же, видимо, соснул
|
Что то ты здесь перепутал. В Linux как раз gcc по умолчанию и установлен. Причем он там намного лучше чем всякие его mingw реализации в Windows. К тому же компонует компоновщик, а не компилятор, просто компилятор через себя его вызывает. В линух все библиотеки обычно дублируются в двух вариантах - статическом и динамическом, поэтому можно задав соответствующий ключ прилинковать как больше нравится. Линковать opengl статически не лучший вариант - он же обновляется (сохраняя совместимость), к тому же будет куча продублированного кода (в том числе загруженного в память).
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:14.
|