próby dołączenia rozszerzeń opengl

0

Piszę grę używając opengl+sfml. Jednak natrafiłem na problem którego nie mogę rozwiązać. Potrzebuję parę dodatkowych funkcji typu glActiveTexture oraz glGenFramebuffers których nie daje mi plik gl.h. Jak te funkcje dodać? Próbowałem z pomocą glew(błąd kompilacji) oraz loadGL.h(z SDL tutaj aplikacja się tworzyła ale nie dało się jej uruchomić) lecz bezskutecznie...

0

Pokaż kod.

0

to nie ma za bardzo sensu... ale ok.
jak dodam opengl w taki sposób to program się kompiluje ale nie daje się otworzyć

#include<GL/loadGL.h> 

a potem w main do działającego normalnie programu(szablon dla opengl) dodałem linijkę:glGenFramebuffers(1,&framebuffer);

 i jak zamiast loadGL.h dam zwyczajne gl.h to mam błąd że nie zdefiniowane... a dla glew mam tak:<code class="cpp">#define GLEW_STATIC
#include<GL/glew> 

i dodałem do linkera glew32s.lib i tutaj mam błąd taki że pojawia się okno z komunikatem "It seems that this project has not been built yet"

0

Wydaje mi się, że powinieneś zaincludować glew.h, bez glewa to nie zadziała chyba, tylko musisz zaincludować glew.h dosyć wcześnie, tj. przed plikem OpenGL.hpp od SFMLa.

0

includowanie loadGL.h i glew.h razem z definami miałem na początku przed wszystkim

1

Potrzebuję parę dodatkowych funkcji typu glActiveTexture oraz glGenFramebuffers których nie daje mi plik gl.h. Jak te funkcje dodać?

Pod Windowsem pobierając wskaźnik na tę funkcję za pomocą wglGetProcAddress(). Tak robią biblioteki takie jak GLEW.
Coś tego typu:

typedef (__stdcall *glActiveTexture_proc)(GLenum);
glActiveTexture_proc glActiveTexture;



glActiveTexture = (glActiveTexture_proc)wglGetProcAddress("glActiveTexture");



glActiveTexture(...);

Wskaźnik trzymaj jako zmienną globalną albo pole w klasie, żeby GetProcAddress robić tylko raz, nie za każdym razem.

EDIT: na stronie OpenGL-a znajdziesz nagłówki uzupełniające, zawierające to czego nie ma nagłówek windowsowy. Zwłaszcza glext.h jest przydatny, dzięki niemu nie będziesz musiał szukać prawidłowej wartości każdej nowej stałej. Dynamicznie ładować funkcje jak wyżej pokazałem i tak będzie trzeba, ale z tego co pamiętam glext.h ma już gotowe typedefy do wszystkich funkcji.

EDIT2: jak wspomniałem, typedefy są. więc robisz coś takiego:

#include <GL/glext.h>

PFNGLACTIVETEXTUREPROC glActiveTexture;

glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture");
0

do tego potrzebny jest jakiś dll? bo jak nie to świetnie :)

0

teraz mam coś takiego w pliku który dołącza biblioteki:

#include<cstdlib>
#include<cmath>
#include<vector>
#include<windows.h>
#include<process.h>

using namespace std;

#include <SFML/Window.hpp>
#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>

using namespace sf;

#include<GL/glu.h>
#include<GL/glext.h>
 

i w kolejnym pliku który dołącza poprzedni

PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;

void loadmaincore()
{
    glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress("glGenFramebuffers");
} 

i ten plik jest dołączony do programu w main.cpp i dostaję błąd:

include\initialize.h|19|error: 'PFNGLGENFRAMEBUFFERSPROC' does not name a type| 
0

z tego co zaobserwowałem podczas losowych zmian kodu to jak nie używam funkcji opengl to program normalnie się kompiluje, nie wiem jeszcze które nie psują program

0

po dodaniu linijki:

glMatrixMode(GL_PROJECTION);
     

pojawia się irytujący komunikat "It seems that this project has not been built yet"

0

ok problem był w linkerze ale teraz mam bardzo dziwny błąd... jak dam ładowanie adresów funkcji to mi pisze, że już istnieją a jak nie dam to mi pisze że nie ma funkcji...

0

kod "działa"... przeniosłem linijkę ładującą adres funkcji z pliku .h do main.cpp i nie ma błędu ale dlaczego?

1

Nie wiem dlaczego dostawałeś akurat ten błąd, ale widzę że źle stosujesz nagłówki.

  • plik .h nie powinien zawierać żadnych using namespace
  • jakiekolwiek using namespace powinny być w plikach .cpp, poniżej wszystkich #include'ów
  • plik .h nie powinien zawierać żadnych zmiennych globalnych. jeśli nagłówek ma udostępniać zmienną globalną, to w .h powinna być ta zmienna ze słowem extern, a w odpowiednim .cpp (i tylko jednym) ta sama zmienna jeszcze raz bez słowa extern.
  • unikaj umieszczania ciał funkcji w plikach .h, jeśli nie ma takiej konieczności (np. w przypadku template'ów)

jeśli będziesz się stosował do tych zasad, nie będziesz dostawał takich dziwnych błędów.

0

tego na kursie nie uczyli :) dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1