2013-02-27 10 views
6

Pracuję nad silnikiem gry i bardzo się rozwinęłam. Ponieważ silnik musi działać również na Macu, nadal używam OpenGL 3.2 i GLSL 1.2 :-(. Używam GLEW, który, jak sądziłem, rozwiązałby dla mnie problemy z rozszerzeniamiRozszerzenia OpenGL, jak z nich korzystać poprawnie w C i glsl

EDYCJA: Tymczasem część pytania jest odpowiedział - czytaj dalej na następnej EDIT:

zawsze byłem w stanie dokonać shadery pracować na obu Windows i Mac, czasami muszę dodać linię w kodzie GLSL jak #extension GL_EXT_gpu_shader4: enable, aby go działa na komputerze Mac, wydaje się więc, że moja wersja systemu Windows ostrzeże Cię podczas kompilowania tego samego modułu cieniującego, ale zadziała,

Ale od tego czasu Zacząłem używać shaderów geometrii, mój koszmar się zaczął. Z jakiegoś powodu Mac spodziewa się, że będę używał #extension GL_EXT_gpu_shader4: włącz, podczas gdy Windows oczekuje, że będę używał #extension GL_EXT_geometry_shader4: enable. To sprawia, że ​​tworzenie wirtualnego modułu cieniującego jest mniej oczywiste.

także, i to jeszcze bardziej irytujące: wersja systemu Windows chce mnie do używania: glTransformFeedbackVaryings i myślę, że GLEW stałaby się dostępna dla mac ale tam wyraźnie trzeba użyć glTransformFeedbackVaryingsEXT, które nie będą pracować w wersji Windows. Muszę #ifdef dla APPLE użyć tego, co jest potrzebne. Ten sam problem z glBeginTransformFeedback i glBeginTransformFeedbackEXT.

Ale zarówno przyjąć glProgramParameteriEXT, tam nie trzeba distiction ...

Rozumiem, że to tylko ze sprzężeniem zwrotnym przekształcenia że mam problem, ale ... co to wszystko o?

Pomyślałem, że rozumiem, jak działają rozszerzenia OpenGL, ale zaczynam tracić to zrozumienie.

Dochodzi do punktu, w którym myślę, że kiedy uruchomię kod na innym systemie Windows lub innym systemie Mac lub innym systemie Linux, będę miał nowe problemy, ponieważ istnieją różne karty graficzne lub coś takiego.

Czy ktoś może mi pomóc to zrozumieć? Czytałem podręcznik OpenGL o rozszerzeniach, więc brakuje mi czegoś oczywistego. Jak mogę się upewnić, że mój kod będzie zawsze działał?

EDIT: Usuwając GLEW całkowicie od wersji Mac i pełne wykorzystanie własnego OpenGL 3.2 wdrożenie systemu Mac za wszystkie namings są normalne i mogę całkowicie usunąć #extension GL_EXT_gpu_shader4: enable z mojego shaderów. Jedyna rzecz, która mnie martwi, to to, że dla shaderów geometrii potrzebuję funkcji, która nie wydaje się istnieć, ale nie wydaje się istnieć, ale robi to. Z jakiegoś powodu ta funkcja działa również w systemie Windows. Czemu? Czy mogę mieć pewność, że będzie działać na wszystkich systemach/sprzęcie?

+0

Jabłko zwykle jest nieco z tyłu, więc może po prostu chcesz sprawdzić oficjalną obsługiwaną wersję. [this] (http://stackoverflow.com/questions/15101939/glsl-vertex-shader-crashes-computer) został opublikowany tuż przed twoim pytaniem. –

+0

Hm, nie sądzę, że post pomaga mi. Pracuję na OSX Lion 10.7.5 i jest to karta graficzna AMD. Ale jeśli dobrze cię rozumiem, problemy są związane ze złym wdrożeniem Apple'a? W jaki sposób wszystkie te gry w pary są przenoszone i działają? – scippie

+0

Dlaczego nie używasz Core OpenGL 3.2 dostępnego na MacOSX. –

Odpowiedz

3

EXT oznacza, że ​​używasz rozszerzenia dla modułu cieniującego geometrii. To powinno działać również w oknach. Cieniowanie geometrii powinno być podstawową funkcjonalnością w OpenGL 3.2, ale w tej chwili używasz rozszerzenia (Zasadniczo korzystasz z funkcjonalności starszych wersji OpenGL, a nie wersji 3.2). Aby użyć modułu cieniującego geometrii rdzenia, musisz przejść do GLSL 1.5.

Nie jestem dobrze zorientowany w OpenGL, ale moim założeniem jest, że glProgramParameteri() nie jest już konieczne, jeśli zaczniesz używać podstawowej funkcjonalności, dlatego brakuje jej w nagłówkach bibliotek.

+0

Dzięki, to jest bardzo interesująca odpowiedź. Zaabsorbuję to i poświęcę trochę czasu, aby dowiedzieć się, czy całkowicie odpowiada na moje pytanie. – scippie

+0

Masz rację, że funkcja glProgramParameteri() nie jest już potrzebna w podstawowej funkcjonalności. Tam te parametry są ustawione wewnątrz samego kodu modułu cieniującego. – scippie

+0

Sądzę, że w pełni odpowiedziałeś na moje pytanie. Zaznaczę to jako poprawną odpowiedź. – scippie

2

Twoje życie będzie łatwiejsze, jeśli będziesz trzymać się pasujących wersji OpenGL/GLSL.

http://en.wikipedia.org/wiki/OpenGL_Shading_Language

wybrać z:

  • OpenGL 2.1, z GLSL 120 + GL_EXT_gpu_shader4 + GL_EXT_geometry_shader4
  • OpenGL 3.2, GLSL 150
  • OpenGL 3.3 z GLSL 330

Jeśli już jesteś zadowolony z używania OpenGL 3.2, a następnie przejdź do GLSL 1 50, ponieważ jest bliżej nowoczesnego GLSL 330+. Jeśli chcesz uzyskać największą kompatybilność, użyj OpenGL 2.1, GLSL 120 oraz rozszerzenia modułu cieniującego geometrii. (chociaż nie jestem pewien, o ile większa kompatybilność go kupuje)

TYLKO przy korzystaniu z rozszerzeń GLSL 120 plus, należy użyć funkcji glProgramParameteriEXT() w celu określenia typu/liczby wyjściowej modułu cieniującego geometrii oraz liczby wierzchołków. Na przykład:

glUseProgram(prog); 
glProgramParameteriEXT(prog, GL_GEOMETRY_INPUT_TYPE_EXT, GL_TRIANGLES); 
glProgramParameteriEXT(prog, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP); 
glProgramParameteriEXT(prog, GL_GEOMETRY_VERTICES_OUT_EXT, max_output_verticies); 

https://wiki.engr.illinois.edu/display/graphics/Geometry+Shader+Hello+World

W OpenGL 3.2, GLSL 150+, należy podać te informacje w swojej cieniującego, używając deklarację jak:

#version 150 
layout (triangles) in; 
layout (triangle_strip, max_vertices = 3) out; 

http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/geometry-shader/

+0

Cóż David, dziękuję, a ja całkowicie się z tym zgadzam, ale o to chodzi: kiedy próbuję stworzyć moje shadery, aby być kompatybilnym z Macem, muszę użyć 120 + rozszerzeń. Działa to dobrze, ale nie zadziała na moim komputerze stacjonarnym, na którym sterownik nvidia zawiedzie na linii pomocniczej, aby nie istniał. W tej chwili porzuciłem wsparcie dla mac, zawsze mogę napisać dodatkowy kod dla mac później. Po prostu mnie powstrzymuje. Jestem bardzo zadowolony z 3.3 + 330 teraz. – scippie

Powiązane problemy