2014-02-08 88 views
1

我懷疑我可能在我的opengl頭文件中缺少代碼,或者我的編譯無法查詢和加載與着色器編譯相關的代碼。我使用Simple DirectMedia Layer,我可以編寫和運行OpenGL代碼的所有短片 - 直到我着色。我有一個朋友有同樣的問題。當我得到着色器時,我得到了很多未聲明的語句:OpenGL Shader編譯代碼位於何處?

$ make 
cc -c -o proceduralTexture.o proceduralTexture.c 
proceduralTexture.c: In function 'PrintShaderLog': 
proceduralTexture.c:60:22: error: 'GL_INFO_LOG_LENGTH' undeclared (first use in 
this function) 
    glGetShaderiv(obj,GL_INFO_LOG_LENGTH,&len); 
        ^
proceduralTexture.c:60:22: note: each undeclared identifier is reported only onc 
e for each function it appears in 
proceduralTexture.c:70:22: error: 'GL_COMPILE_STATUS' undeclared (first use in t 
his function) 
    glGetShaderiv(obj,GL_COMPILE_STATUS,&len); 
        ^
proceduralTexture.c: In function 'PrintProgramLog': 
proceduralTexture.c:76:23: error: 'GL_INFO_LOG_LENGTH' undeclared (first use in 
this function) 
    glGetProgramiv(obj,GL_INFO_LOG_LENGTH,&len); 
        ^
proceduralTexture.c:85:23: error: 'GL_LINK_STATUS' undeclared (first use in this 
function) 
    glGetProgramiv(obj,GL_LINK_STATUS,&len); 
        ^
proceduralTexture.c: In function 'SDL_main': 
proceduralTexture.c:430:34: error: 'GL_FRAGMENT_SHADER' undeclared (first use in 
this function) 
    _procShader = glCreateShader(GL_FRAGMENT_SHADER); 
           ^
proceduralTexture.c:438:34: error: 'GL_VERTEX_SHADER' undeclared (first use in t 
his function) 
    _vertShader = glCreateShader(GL_VERTEX_SHADER); 
           ^
make: *** [proceduralTexture.o] Error 1 

我有OpenGL版本4.2。我包括proceduralTexture.c的文件有:

#include <stdio.h> 
#include <math.h> 
#include "SDL/SDL.h" 
#include <GL/gl.h> 
#include <GL/glu.h> 

而且我生成文件看起來像這樣:

proceduralTexture: proceduralTexture.o 
# Windows 
    gcc -Wall -O3 -o [email protected] $^ -lopengl32 -lmingw32 -lSDLmain -lSDL -lSDL_mixer -lz 

我缺少什麼?

+0

如果你#include '它工作嗎? OpenGL規範指出:「'和''的組合總是爲最新OpenGL版本的所有配置文件以及註冊表中定義的所有擴展定義所有API。」如果你使用核心配置文件,那麼規範說你可以使用'#include '。 – bames53

+0

我累了'#包括'沒有運氣(沒有變化)。我似乎沒有glcorearb頭文件。 – danglingPointer

回答

2

我錯過了什麼?

,在大多數操作系統上的應用程序二進制接口(ABI)對OpenGL只能進入1.1版本或1.2自帶的版本高於必須在運行時加載的一切。這被稱爲擴展機制

MacOS X是一個例外,其中可用的OpenGL版本是由操作系統版本直接確定的,OpenGL框架已經涵蓋了該特定版本的所有需求。

獲得現代OpenGL功能的最簡單方法是使用擴展裝載器包裝器。不幸的是,最流行的一個(GLEW)仍然沒有完全覆蓋核心配置文件(您必須啓用實驗性功能)。儘管如此,爲了讓着色器工作,這已經足夠好了。

因此,我建議到The GLEW homepage第一讀取所有文件,然後下載GLEW 來源(不要用預製的二進制庫版本打擾)添加源到項目,並使用一個靜態編譯。在之後調用glewInit()你創建了一個OpenGL上下文,並且應該覆蓋它。