forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Code::Blocks + modern OpenGL (http://forum.boolean.name/showthread.php?t=18455)

Nikich 12.08.2013 20:26

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" в папке с нашим проектом и заполним его следующим кодом:

PHP код:

#define GLEW_STATIC
#include <GL/glew.h>
#include <GL/glew.c>
#include <GLFW/glfw3.h>
#include <iostream>
int main(void)
{

    
GLFWwindowwindow;
    if (!
glfwInit())
        return -
1;
    
window glfwCreateWindow(640480"Hello World"NULLNULL);
    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.0f0.0f,
   
1.0f, -1.0f0.0f,
   
0.0f,  1.0f0.0f,
    };
    
GLuint vertexbuffer;
    
glGenBuffers(1, &vertexbuffer);
    
glBindBuffer(GL_ARRAY_BUFFERvertexbuffer);
    
glBufferData(GL_ARRAY_BUFFERsizeof(g_vertex_buffer_data), g_vertex_buffer_dataGL_STATIC_DRAW);
    while (!
glfwWindowShouldClose(window))
    {
        
glEnableVertexAttribArray(0);
        
glBindBuffer(GL_ARRAY_BUFFERvertexbuffer);
        
glVertexAttribPointer(03GL_FLOATGL_FALSE0, (void*)0);
        
glDrawArrays(GL_TRIANGLES03);
        
glDisableVertexAttribArray(0);
        
glfwSwapBuffers(window);
        
glfwPollEvents();
    }
    
glfwTerminate();
    return 
0;



Нажимаем F9, видим белый треугольник и "WIN!" в консоли, радуемся тому, что у нас есть поддержка OpenGL 4.3 в отличном IDE - Code::Blocks.
Спасибо за внимание, надеюсь, кому-нибудь пригодится:)

Gector 16.08.2013 23:57

Ответ: Code::Blocks + modern OpenGL
 
Выдает:
Цитата:

C:\Dev\CPP\GLEW\main.cpp|3|GL/glew.c: No such file or directory|
Эммм... Так куда его пихать?)

Nikich 17.08.2013 01:44

Ответ: Code::Blocks + modern OpenGL
 
Проверь пути во вкладке Compiler, возможно не то указал.

Gector 17.08.2013 01:58

Ответ: Code::Blocks + modern OpenGL
 
Цитата:

Сообщение от Nikich (Сообщение 265424)
Проверь пути во вкладке Compiler, возможно не то указал.

Все точно по инструкции. Где .c-файл должен быть?

Nikich 17.08.2013 02:07

Ответ: Code::Blocks + modern OpenGL
 
Там же, где и glew.h .

Gector 17.08.2013 02:12

Ответ: Code::Blocks + modern OpenGL
 
Цитата:

Сообщение от Nikich (Сообщение 265426)
Там же, где и glew.h .

То есть его надо переместить в "c:\glew\include\"?

Nikich 17.08.2013 02:26

Ответ: Code::Blocks + modern OpenGL
 
В папку /include/GL.

Gector 23.10.2013 22:27

Ответ: Code::Blocks + modern OpenGL
 
Глупый вопрос но все же задам его. Как добавить поддержку предыдущих версий GL?)

Nikich 24.10.2013 00:44

Ответ: Code::Blocks + modern OpenGL
 
Использовать старые версии OGL. Нельзя совместить функционал и нового и старого в одном проекте, как я понимаю, ведь там совсем разные подходы.

Nikich 24.10.2013 19:16

Ответ: Code::Blocks + modern OpenGL
 
Какой самый правильным способ объединить несколько библиотек в одну DLL? Запихнуть все исходники в один и из него уже запилить DLL?

HolyDel 24.10.2013 20:59

Ответ: Code::Blocks + modern OpenGL
 
Цитата:

Какой самый правильным способ объединить несколько библиотек в одну DLL? Запихнуть все исходники в один и из него уже запилить DLL?
я делал так.
как показала практика - это самый удобный способ. Собирать статические либы в виде компонентов, или тем более длл-лок оказалось очень муторно. Да, увеличивается время компиляции и особенно время линковки, но зато настройки проекта можно менять очень быстро. Не собирая тыщи либ на каждый чих.

Nikich 27.10.2013 01:21

Ответ: Code::Blocks + modern OpenGL
 
Ещё один вопрос касательно создания библиотеки. Как сделать статичную либу, которая использует для своей работы другие статичные либы?
Для поддержки OGL, приходится использовать как минимум следующие флаги:"-lopengl32 -lgdi32 -luser32 -lkernel32". Поэтому, если либа работает с OGL, она должна включить в себя данные библиотеки, что делать она отказывается:( Как быть?

pozitiffcat 28.10.2013 09:13

Ответ: Code::Blocks + modern OpenGL
 
Цитата:

Сообщение от Nikich (Сообщение 269373)
Ещё один вопрос касательно создания библиотеки. Как сделать статичную либу, которая использует для своей работы другие статичные либы?
Для поддержки OGL, приходится использовать как минимум следующие флаги:"-lopengl32 -lgdi32 -luser32 -lkernel32". Поэтому, если либа работает с OGL, она должна включить в себя данные библиотеки, что делать она отказывается:( Как быть?

статически нельзя слинковать в библиотеку динамические библиотеки, какими является opengl32, glu, glut и т.д. либо смирись, либо компиль динамическую библиотеку. Ты должен понимать, что статическая библиотека, это архив с отдельно откомпилированными исходными файлами c, cpp (единицами трансляции), когда ты линкуешь ее в проект происходит тоже самое если бы использовал исходники, только эти уже заранее откомпилированы. Вот динамическая библиотека наоборот, компилируется и линкуется с другими библиотеками так же как и exe файл. Поэтому при подключении динамической библиотеки не требуется еще указывать кучу зависимых библиотек, но стоит учесть что dll компоненты которые она использует в системе необходимы быть

Nikich 28.10.2013 20:27

Ответ: Code::Blocks + modern OpenGL
 
Милый Linux умеет объединять, разбивая статик либы на объекты, а потом компонуя обратно в либу. Также вычитал, что и студия умеет. GCC же, видимо, соснул:(

Samodelkin 28.10.2013 23:40

Ответ: Code::Blocks + modern OpenGL
 
Цитата:

Сообщение от Nikich (Сообщение 269417)
Милый Linux умеет объединять, разбивая статик либы на объекты, а потом компонуя обратно в либу. Также вычитал, что и студия умеет. GCC же, видимо, соснул:(

Что то ты здесь перепутал. В Linux как раз gcc по умолчанию и установлен. Причем он там намного лучше чем всякие его mingw реализации в Windows. К тому же компонует компоновщик, а не компилятор, просто компилятор через себя его вызывает. В линух все библиотеки обычно дублируются в двух вариантах - статическом и динамическом, поэтому можно задав соответствующий ключ прилинковать как больше нравится. Линковать opengl статически не лучший вариант - он же обновляется (сохраняя совместимость), к тому же будет куча продублированного кода (в том числе загруженного в память).


Часовой пояс GMT +4, время: 11:25.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot