Начал изучать OpenGL по курсу "Gameinstitute - OpenGL Graphics Programming". В третьем видио на восемнадцатой минуте происходит сборка сцены, а у меня повыпрыгивали ошибки ;_;
В сборка при вызове функций с префиксом glfw выкидывает ошибку LNK2019 (не видит glfw3) но у меня все подключения присутствуют (на glew не жалуется что уже хорошо) и без вызова функции проект собирается.
Библиотеки скачал с сайта http://www.glfw.org/ https://www.opengl.org/sdk/libs/GLEW/
// lession1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#include "pch.h"
#include <iostream>
// #define GLEW_STATIC
// #include "common/includes/GL/glew.h" //глев подключ раньше ост
// #include "common/includes/GLFW/glfw3.h"
#include <GL/glew.h> //глев подключ раньше ост
#define GLFW_DLL
#include <GLFW/glfw3.h>
const char * APP_TITLE = "Introduction to Modern OpenGL - Hello Windows 1";
const int gWindowWidth = 800;
const int gWindowHeight = 600;
int main()
{
if (!glfwInit()) // если глф инит не инициализированно то сюда не зайдет (проверка на подключение библиотек)
{
std::cerr << "GLFW initialization failed" << std::endl;
return -1;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
GLFWwindow * pWindow = glfwCreateWindow(gWindowWidth, gWindowHeight, APP_TITLE, NULL, NULL);
if (pWindow == NULL)
{
std::cerr << "Falled to create GLFW window " << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(pWindow); // тоже почитай
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) // если инициализалция не ок, то предупрежд и поджопник
{
std::cerr << "GLEW initialization falied" << std::endl;
return -1;
}
// main loop
while (!glfwWindowShouldClose(pWindow))
{
glfwPollEvents();
glfwSwapBuffers(pWindow);
}
glfwTerminate();
return 0;
}
Что я делаю не так ??
Потом попробовал в QtСreatore сотворить
.ПРО
QT += core gui opengl
TARGET = untitled9
TEMPLATE = app
#CONFIG += c++11 console
#CONFIG -= app_bundle
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp
DISTFILES += \
glew32.lib \
glew32s.lib \
glfw3.lib \
glfw3dll.lib \
glfw3.dll
HEADERS += \
eglew.h \
glew.h \
glfw3.h \
glfw3native.h \
glxew.h
LIBS += -lOpengl32 \
Первый вариант main.cpp
#include <QCoreApplication>
#include <glew.h>
#include <glfw3.h>
#include "stdio.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//---
// start GL context and O/S window using the GLFW helper library
if (!glfwInit()) {
fprintf(stderr, "ERROR: could not start GLFW3\n");
return 1;
}
// uncomment these lines if on Apple OS X
/*glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);*/
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello Triangle", NULL, NULL);
if (!window) {
fprintf(stderr, "ERROR: could not open window with GLFW3\n");
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
// start GLEW extension handler
glewExperimental = GL_TRUE;
glewInit();
// get version info
const GLubyte* renderer = glGetString(GL_RENDERER); // get renderer string
const GLubyte* version = glGetString(GL_VERSION); // version as a string
printf("Renderer: %s\n", renderer);
printf("OpenGL version supported %s\n", version);
// tell GL to only draw onto a pixel if the shape is closer to the viewer
glEnable(GL_DEPTH_TEST); // enable depth-testing
glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
/* OTHER STUFF GOES HERE NEXT */
// close GL context and any other GLFW resources
glfwTerminate();
//---
return a.exec();
}
Второй вариант main.cpp (это первый пример из OpenGL SuperBible (6th Edition))
#include <QCoreApplication>
#include <glew.h>
#include <glfw3.h>
#include "stdio.h"
GLuint compile_shaders(void);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
GLuint compile_shaders(void);
return a.exec();
}
GLuint compile_shaders(void)
{
GLuint vertex_shader;
GLuint fragment_shader;
GLuint program;
// Source code for vertex shader
static const GLchar * vertex_shader_source[] =
{
"#version 430 core \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = vec4(0.0, 0.0, 0.5, 1.0); \n"
"} \n"
};
// Source code for fragment shader
static const GLchar * fragment_shader_source[] =
{
"#version 430 core \n"
" \n"
"out vec4 color; \n"
" \n"
"void main(void) \n"
"{ \n"
" color = vec4(0.0, 0.8, 1.0, 1.0); \n"
"} \n"
};
// Create and compile vertex shader
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
glCompileShader(vertex_shader);
// Create and compile fragment shader
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
glCompileShader(fragment_shader);
// Create program, attach shaders to it, and link it
program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
// Delete the shaders as the program has them now
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
return program;
}
В случае с Qt не видит функции библиотек как glew так и glfw.
прим: undefined reference to `_imp____glewCreateShader'
В общем удалось решить через QtCreator
Скачанные архивы glew-2.1.0-win32.zip и glfw кладём в папку проекта. Я их для удобства переименовал glew_bin и glfw_bin.
Добавил от туда библиотеки и заголовочные файлы . Добавлял библиотеки через интерфейс пользователя.
Снимем фсе :3 галочки
Подключаем библиотеку лежащую (МИНГВЕЕЕ)(у меня сборщик из коробки Qt5.10.1) в C:\Qt\Qt5.10.1\Tools\mingw530_32\i686-w64-mingw32\lib\libgdi32.a
ОБЯЗАТЕЛЬНО НАДО ПОДКЛЮЧИТЬ !!!! libgdi32.a
В общем основные сложности прошли (добавлял заголовочные файлы через "Добавить существующие файлы...") и для удобства прописываем INCLUDEPATH(чтоб при подключении полный путь не прописывать).
Еще в самом коде надо подключать заголовочном файлы в таком порядке :
#include <stdio.h>
#include <iostream>
#include <cstdio> // обязательно подключаем для инициализации GLchar и других опенГЛовских переменных
#include <glew.h> //глев подключ раньше ост опенГЛовских библиотек
#include <GL/gl.h>
#include <glfw3.h>
С начало cstdio --> glew --> gl ---> glfw3 .
Только так один за другим (как чёрт за мужиком :3) иначе будет ругаться.
Вот КОД :
experiment.pro
CONFIG += c++11 console
CONFIG -= app_bundle
CONFIG -= qt
DEFINES += QT_DEPRECATED_WARNINGS
QT += opengl
LIBS += -lopengl32
SOURCES += main.cpp
#-
INCLUDEPATH += $$PWD/glfw_bin/include/GLFW/ # добавляем для удобства чтоб напрямую писать
INCLUDEPATH += $$PWD/glew_bin/include/GL/ # только название заголовчного файла без полного пути
HEADERS += \
glfw_bin/include/GLFW/glfw3.h \
glfw_bin/include/GLFW/glfw3native.h \
glew_bin/include/GL/glew.h
#-
win32: LIBS += -L$$PWD/glfw_bin/lib-mingw/ -lglfw3
INCLUDEPATH += $$PWD/glfw_bin/lib-mingw
DEPENDPATH += $$PWD/glfw_bin/lib-mingw
win32: LIBS += -L$$PWD/glfw_bin/lib-mingw/ -lglfw3dll
INCLUDEPATH += $$PWD/glfw_bin/lib-mingw
DEPENDPATH += $$PWD/glfw_bin/lib-mingw
#-- тут попытка
win32: LIBS += -L$$PWD/glew_bin/lib/Release/Win32/ -lglew32
INCLUDEPATH += $$PWD/glew_bin/lib/Release/Win32
DEPENDPATH += $$PWD/glew_bin/lib/Release/Win32
#- дошло до смешного надо из компилятора библиотеки подтягивать а то он не справляется :3
win32: LIBS += -LC:/Qt/Qt5.10.1/Tools/mingw530_32/i686-w64-mingw32/lib/ -lgdi32
INCLUDEPATH += C:/Qt/Qt5.10.1/Tools/mingw530_32/i686-w64-mingw32/include
DEPENDPATH += C:/Qt/Qt5.10.1/Tools/mingw530_32/i686-w64-mingw32/include
#--#
main.cpp
#include <stdio.h>
#include <iostream>
#include <cstdio> // обязательно подключаем для инициализации GLchar и других опенГЛовских переменных
#include <glew.h> //глев подключ раньше ост опенГЛовских библиотек
#include <GL/gl.h>
#include <glfw3.h>
#define GLEW_STATIC
const char * APP_TITLE = "Introduction to Modern OpenGL - Hello Windows 1";
const int gWindowWidth = 800;
const int gWindowHeight = 600;
int main()
{
if (!glfwInit()) // если глф инит не инициализированно то сюда не зайдет (проверка на подключение библиотек)
{
std::cerr << "GLFW initialization failed" << std::endl;
return -1; // я как понял прерывает прогу из за того что ретюрн -1 это по сути команда прекращения работы проги
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
GLFWwindow * pWindow = glfwCreateWindow(gWindowWidth, gWindowHeight, APP_TITLE, NULL, NULL);
if (pWindow == NULL)
{
std::cerr << "Falled to create GLFW window " << std::endl;
glfwTerminate(); // ? не совсем понятно что она делает
return -1; // команда прекращения работты проги
}
glfwMakeContextCurrent(pWindow); // тоже почитай
// glewExperimental = GL_TRUE; .// заблочил в связи того что он давал ошибку: "не инициализированная переменная " хотя
// glewExperimental относиться к GLEWAPI (переменная апишника) странно :/
if (glewInit() != GLEW_OK) // если инициализалция не ок, то предупреждение и поджопник
{
std::cerr << "GLEW initialization falied" << std::endl;
return -1; // команда прекращения работы проги
}
// main loop
while (!glfwWindowShouldClose(pWindow))
{
glfwPollEvents();
glfwSwapBuffers(pWindow);
}
glfwTerminate();
return 0;
}
Ух фсе :3
Виртуальный выделенный сервер (VDS) становится отличным выбором
Почему-то поток ввода не дает знаки пробелов/перехода на новую строкуФрагмент кода: