2009-06-19 17 views
7

Kitaplığımı, Windows altında Dev-C++'da yeniden oluşturmak üzereydim; Ancak, bu arada eklediğim gölgelendirici işlevi desteklenmiyor, derleyici ilgili işlevleri bulamadı (:: glCreateShader(), :: glCreateProgram(), vb)OpenGL v2.0 Dev-C++ ve SDL ile Shader'lar?

İnternet ve Dev-C++ klasörü, OpenGL uygulamasının (gl.h) sadece v1.1 olduğunu buldum. En son başlıkları SGI'dan indirmek için recommendations buldum. Gl3.h'yi buldum, ancak daha yakından inceledikten sonra gl.h projemde zaten yer almadığını fark ettim ve SDL/SDL_opengl.h dosyasına bakmalıydım.

DÜZENLEME: SDL_opengl.h ve söz konusu fonksiyonların prototipleri beyan gl.h içermez. Öyleyse soru şu ki, neden bağlayıcı hatalardan ziyade derleme zamanı hataları verdim?

(My kütüphane sadece ben herhangi bir sorun yoktu tabii) arasında, çok OSX altında (hariç mingw32 için olduğu gibi, mingw32, libOpenGL32, libsdl, libSDL_Image ve libSDL_Mixer karşı bağlar.)

Nasıl kullanabilirsiniz DevG + ve SDL ile OpenGL v2.0 shader?

+0

Dünyada neden Dev-C++ kullanmak istiyorsunuz? Kendinize bir iyilik yapın ve son 4 yılda güncellenen bir IDE kullanın. (ve desteklenmediğinde bile buggy ve eksik özellikler yoktu) – jalf

+0

Neden VC++ 2008 Express yerine Dev-C++ seçtiniz? –

+0

Adil bir nokta ve bunun geldiğini görmediğimi söyleyemem. Windows birincil platformum olmayacaktı ve manifestoların ve MSVC çalışma zamanlarının 6 çeşitliliğinin hokkabazlığına bayıldım.Ek olarak, GP2X için geliştirecektim ve onun resmi devkit bir devriye dışı Dev-C++, bu yüzden kullanışlı olduğunu düşündüm ... Evet, öyle değil. – zyndor

cevap

8

gl.h sadece OpenGL 1.1 (ve bazı durumlarda 1.3 kadar kullandığınız dosya ve hangi işletim sisteminin hangi sürümüne bağlı) içindir. Diğer her şey için ek olarak glext.h ve muhtemelen glxext.h (Linux/Unix) veya wglext.h (Windows) gerekir.

OpenGL'nin daha yeni sürümlerindeki tüm işlevler çalışma zamanında bağlanmalıdır. Bu yüzden onları kullanabilmek için doğru fonksiyon adresini almalı ve bir fonksiyon göstericisine atamalısınız. Bunu yapmanın en kolay yolu, GLEW gibi bir şey kullanmaktır.

PFNGLCREATESHADERPROC glCreateShader = NULL; 
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader"); 

veya Linux için

:

PFNGLCREATESHADERPROC glCreateShader = NULL; 
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader"); 

Eğer GL_GLEXT_PROTOTYPES tanımlarsanız ilk satırı atlayabilirsiniz glext.h eklemeden önce

manuel yolu böyle bir şey olurdu.

DÜZENLEME: SDL_opengl.h glext.h dosyasının bir kopyasını içerir (güncel değil). Yani eğer bunu kullanırsanız, yukarıdaki geçerli olmalıdır. Eğer ayrı bir glext.h kullanmak isterseniz, SDL_opengl.h'yi eklemeden önce NO_SDL_GLEXT tanımlamanız gerekir. Ayrıca, GL_GLEXT_PROTOTYPES tanımlanmadığı sürece ya da bunları kendiniz yazdığınız sürece işlev prototipleri kullanılamaz.

EDIT2: Görünüşe göre SDL, SDL_GL_GetProcAddress adı verilen kendi GetProcAddress işlevine sahiptir.

+0

"Ayrıca, GL_GLEXT_PROTOTYPES tanımlanmadığı sürece ya da bunları kendiniz yazdığınızda işlev prototipleri kullanılamaz." <- BU. Teşekkür ederim! SDL_GL_GetProcAddress öğesinden bahsetmek için – zyndor

+0

+1. – Caterpillar

0

İşlevlerin adreslerini çalışma zamanında yükleyebilir misiniz?

typedef GLhandle (APIENTRYP PFNGLCREATESHADERPROC) (GLenum shaderType); 
PFNGLCREATESHADERPROC glCreateShader = NULL; 
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader"); 

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC)(); 
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL; 
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");