我怀疑我的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
我错过了什么?
答案 0 :(得分:2)
我错过了什么?
在大多数操作系统中,OpenGL的应用程序二进制接口(ABI)仅适用于版本1.1或1.2,并且必须在运行时加载版本晚于此版本的所有内容。这称为扩展机制。
例外是MacOS X,其中可用的OpenGL版本直接由操作系统版本决定,OpenGL框架已经涵盖了该特定版本的所有需求。
获得现代OpenGL功能的最简单方法是使用扩展加载器包装器。不幸的是,最受欢迎的(GLEW)仍未完全覆盖核心配置文件(您必须启用实验性功能)。然而,为了让着色器工作,它已经足够好了。
所以我建议首先The GLEW homepage 首先阅读所有文档然后下载GLEW 来源(不要打扰预先构建的二进制库版本)将源添加到项目中并使用静态构建。在创建OpenGL上下文之后调用glewInit()
,并且应该覆盖它。