该程序使用 SDL2 和 openGL 用 C 语言编写。只要我注释掉
//glUseProgram(0);
程序编译并运行并显示 glCleared 颜色。包括 gl 版本检查:
const char* renderer = (const char*) glGetString(GL_RENDERER);
puts(renderer);
const char* version = (const char*) glGetString(GL_VERSION);
puts(version);
const char* glslVersion = (const char*) glGetString(GL_SHADING_LANGUAGE_VERSION);
puts(glslVersion);
哪个打印出来:
ATI Radeon HD 5670
3.2.11927 Core Profile Context
4.20
和 gl 错误检查:
GLenum error = glGetError();
switch(error){
case GL_NO_ERROR: puts("no error"); break;
case GL_INVALID_ENUM: puts("invalid enum"); break;
case GL_INVALID_VALUE: puts("invalid value"); break;
case GL_OUT_OF_MEMORY: puts("out of memory"); break;
case GL_INVALID_FRAMEBUFFER_OPERATION: puts("invalid framebuffer operation"); break;
default: break;
}
打印:
no error.
但是当 glUseProgram(0) 未注释时,我收到以下错误:
D:\TEMP\ccSTF4cr.o:App.c:(.text+0x320): undefined reference to 'glUseProgram
我也得到:
App.c:54.2: warning: implicit declaration of function 'glUseProgram'
包含的文件是:
#include "SDL2/SDL.h"
#include "SDL2/SDL_opengl.h"
该程序在 Windows XP 上使用 .bat 文件执行。.bat 是:
del /F /Q bin\app.exe
set files=main.c App.c EventHub.c Game.c MainShader.c
set libs=-LD:\environments\minGW\mingw32\lib -lmingw32 -lopengl32 -lSDL2main -mwindows -lSDL2
set objs=bin\main.obj
gcc -Wall -o bin/app %files% %libs%
bin\app.exe
如果您不知道 .bats,命令中的 %file% 和 %libs% 只是简单地替换变量中的字符串。
问题似乎是上下文不支持后来的 glUseProgram 函数,除了上下文是支持该函数的 3.2 版这一事实。在这种情况下,问题似乎与 SDL_opengl.h 相关,包括选择了错误的 -lopengl32。但坦率地说,我真的不明白为什么我要问这个问题。