2014-02-08 54 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上下文,并且应该覆盖它。