PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL 2.0 Core Funktionalität und Grafiktreiber


Asmodeus
2006-10-20, 12:04:25
Mit OpenGL 2.0 sind vor langer Zeit schon alle Funktionalitäten zur Verarbeitung von GLSL-Shadern aus den Extensions in den Core gewandert. Beispielsweise wurde dadurch aus glCreateShaderObjectARB( ) (Befehl der zugehörigen Extension) dann glCreateShader( ) (Befehl des Cores). Damit man den neuen Befehl nutzen kann, benötigt man natürlich einen entsprechenden glext.h Header, in dem dann folgendes auftaucht:


...
#ifndef GL_VERSION_2_0
#define GL_VERSION_2_0 1
#ifdef GL_GLEXT_PROTOTYPES
...
GLAPI GLuint APIENTRY glCreateShader (GLenum);
...
typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);


Sobald ich in meinem Programmcode nun glCreateShaderObjectARB( ) gegen glCreateShader( ) austausche, wird das Programm ohne Fehler kompiliert, bei der Ausführung stürzt es dann aber genau beim Aufruf von glCreateShader( ) ab. Woran kann das liegen, habe ich irgend etwas vergessen?

Gruss, Carsten.

Gast
2006-10-20, 14:07:31
Windows oder Linux? Unter Windows kannst das Zeug ja so gar nicht ansprechen.

tokugawa
2006-10-20, 14:52:34
Es stürzt wohl ab, weil du unter Windows zu den Funktionspointern noch die tatsächlichen Entry-Points binden mußt.

Ich tät GLEW empfehlen, das macht das schon für alle bekannten Extensions und Core-Funktionen.

Asmodeus
2006-10-20, 16:39:25
Es stürzt wohl ab, weil du unter Windows zu den Funktionspointern noch die tatsächlichen Entry-Points binden mußt.

Ich tät GLEW empfehlen, das macht das schon für alle bekannten Extensions und Core-Funktionen.

Naja, ich nehme dafür die von Nvidia bereitgestellten und von mir modifizierten glh-Header.

Dort steht dann natürlich noch folgendes:

...
#ifdef __cplusplus
extern "C" {
#endif

#include <GL/gl.h>
#include <GL/glext.h>
#if defined(WIN32)
# include <GL/wglext.h>
# define GLH_EXT_GET_PROC_ADDRESS(p) wglGetProcAddress(p)
#elif defined(UNIX)
# include <string.h>
# include <GL/glx.h>
# include <GL/glxext.h>
# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB( (const GLubyte *) p)
#endif

#ifdef GLH_EXT_SINGLE_FILE
# define GLH_EXTERN
# define GLH_INITIALIZER = 0
#else
# define GLH_EXTERN extern
# define GLH_INITIALIZER
#endif

#define GLH__PREPROCESSOR_GYMNASTICS2(a,b) a##b
#define GLH__PREPROCESSOR_GYMNASTICS(a,b) GLH__PREPROCESSOR_GYMNASTICS2(a,b)

#ifndef _WIN32
#define GLH_EXT_PREFIX _
#endif
#ifndef GLH_EXT_PREFIX
# define GLH_EXT_NAME(a) a
#else
# define GLH_EXT_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_EXT_PREFIX,a)
#endif

#ifndef _WIN32
# ifndef GLH_CORE_PREFIX
# define GLH_CORE_PREFIX _
# endif
#endif

#ifndef GLH_CORE_PREFIX
# define GLH_CORE_NAME(a) a
#else
# define GLH_CORE_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_CORE_PREFIX,a)
#endif
...
#ifdef _WIN32
#if defined(GL_VERSION_2_0)
...
GLH_EXTERN PFNGLCREATESHADERPROC GLH_CORE_NAME(glCreateShader) GLH_INITIALIZER;
...
GLH_CORE_NAME(glCreateShader) = (PFNGLCREATESHADERPROC)GLH_EXT_GET_PROC_ADDRESS("glCreateShader");
if (NULL == GLH_CORE_NAME(glCreateShader))
return GL_FALSE;
...
#define glCreateShader GLH_CORE_NAME(glCreateShader)
...


Damit sollte doch alles richtig laufen, oder?

Gruss, Carsten.

ScottManDeath
2006-10-20, 18:51:48
Die sind nicht ganz kompatibel. Die core Funktionen haben uint als return value, die ARB versionen HandleARB. Dein Compiler sollte Dir eine Typkonvertierungs Warnung gegeben haben ;)

Coda
2006-10-20, 18:53:40
Wie jetzt? Es ist doch bekannt dass man unter Windows alles was über 1.2 hinaus geht per Extensions binden muss.

Warum sollte sich das plötzlich geändert haben?