OpenGL着色器编译代码在哪里?

时间:2014-02-08 05:07:00

标签: c opengl sdl shader

我怀疑我的opengl头文件中可能缺少代码,或者我的编译无法查询并加载与着色器编译相关的代码。我正在使用Simple DirectMedia Layer,我可以编写并运行所有OpenGL代码短路 - 直到我使用着色器。我有一个朋友有同样的问题。当我进入着色器时,我得到了很多未声明的陈述:

$ 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>

我的makefile看起来像这样:

proceduralTexture: proceduralTexture.o
#   Windows
    gcc -Wall -O3 -o $@ $^ -lopengl32 -lmingw32 -lSDLmain -lSDL -lSDL_mixer -lz

我错过了什么?

1 个答案:

答案 0 :(得分:2)

  

我错过了什么?

在大多数操作系统中,OpenGL的应用程序二进制接口(ABI)仅适用于版本1.1或1.2,并且必须在运行时加载版本晚于此版本的所有内容。这称为扩展机制

例外是MacOS X,其中可用的OpenGL版本直接由操作系统版本决定,OpenGL框架已经涵盖了该特定版本的所有需求。

获得现代OpenGL功能的最简单方法是使用扩展加载器包装器。不幸的是,最受欢迎的(GLEW)仍未完全覆盖核心配置文件(您必须启用实验性功能)。然而,为了让着色器工作,它已经足够好了。

所以我建议首先The GLEW homepage 首先阅读所有文档然后下载GLEW 来源(不要打扰预先构建的二进制库版本)将源添加到项目中并使用静态构建。在创建OpenGL上下文之后调用glewInit() ,并且应该覆盖它。