1

プログラムは 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% が変数の文字列に置き換えられます。

問題は、コンテキストが関数をサポートするバージョン 3.2 であるという事実を除いて、コンテキストが後の glUseProgram 関数をサポートしていないことです。この場合、問題は SDL_opengl.h インクルードが間違った -lopengl32 を拾っていることにあるようです。しかし、率直に言って、私はこのリンクに関することをよく理解していません。なぜ私は質問をしているのでしょうか。

4

1 に答える 1

2

Microsoft Windows OpenGL API には、せいぜいバージョン 1.X の関数しかありません。(彼らはあなたが Direct3D を使用することを望んでいるからです。)

最新の OpenGL (1995 年より新しいもの) を MS Windows で使用するには、GLEW や GLEE などの拡張機能マネージャーが必要です。詳細については、OpenGL SuperBible のすべてのエディションを参照してください。

于 2013-11-13T23:51:47.130 に答える