注意:glGetString(GL_VERSION)返回:2.1.0 - Build 8.15.10.2361
我已经将GLEW安装到System32,以及VCDir / lib和VCDir / include目录。因此链接器不应该在找到GLEW的必要位时遇到任何问题。我遇到的麻烦是以下代码:
void foo()
{
Uint32 vboId;
glGenBuffers(1, &vboId);
}
给我以下错误:
unresolved external symbol __imp____glewGenBuffers
这个错误是我决定安装GLEW的全部原因。请参阅:unresolved external symbol _glGenBuffers error
除了这个错误之外,还有一些警告有点令人担忧:
Warning 1 warning C4028: formal parameter 3 different from declaration c:\sdl-1.2.14\include\sdl_opengl.h 4855 1 Prototek
Warning 2 warning C4028: formal parameter 3 different from declaration c:\sdl-1.2.14\include\sdl_opengl.h 4857 1 Prototek
Warning 3 warning C4028: formal parameter 2 different from declaration c:\sdl-1.2.14\include\sdl_opengl.h 4859 1 Prototek
Warning 4 warning C4028: formal parameter 2 different from declaration c:\sdl-1.2.14\include\sdl_opengl.h 4861 1 Prototek
Warning 5 warning C4028: formal parameter 3 different from declaration c:\sdl-1.2.14\include\sdl_opengl.h 4868 1 Prototek
Warning 6 warning C4028: formal parameter 3 different from declaration c:\sdl-1.2.14\include\sdl_opengl.h 4869 1 Prototek
另外,像我为GLEW所做的那样,简单地将SDL安装到我的VC inc和lib和System32目录是一个好主意吗?
我的#include位于我文件的顶部,如下所示:
#include <stdio.h>
#include <glew.h>
#include "sdl.h"
#include "sdl_opengl.h"
#include <gl/GLU.h>
#include <gl/GL.h>
但是如果需要,这里是整个代码:
#include <stdio.h>
#include <glew.h>
#include "sdl.h"
#include "sdl_opengl.h"
#include <gl/GLU.h>
#include <gl/GL.h>
Uint32 loadTexture(char* fileName)
{
Uint32 id;
SDL_Surface *img = NULL;
//load into memory using SDL
img = SDL_LoadBMP(fileName);
//generate an id for this texture
glGenTextures(1, &id);
//use this texture
glBindTexture(GL_TEXTURE_2D, id);
//load the texture into video memory via OpenGL
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_RGB,
img->w,
img->h,
0,
GL_BGR,
GL_UNSIGNED_BYTE,
img->pixels
);
//set mip map settings
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
SDL_FreeSurface(img);
return id;
}
Uint32 tex;
void init()
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
tex = loadTexture("fireball.bmp");
}
void foo()
{
Uint32 vboId;
glGenBuffers(1, &vboId);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
glTexCoord2f(0.5, 0.5);
glVertex3f(0.25, 0.25, 0.0);
glTexCoord2f(1.0, 0.5);
glVertex3f(0.5, 0.25, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(0.5, 0.5, 0.0);
glTexCoord2f(0.5, 1.0);
glVertex3f(0.25, 0.5, 0.0);
glEnd();
}
int main()
{
Uint32 isRunning = 1;
SDL_Surface *screen = NULL;
SDL_Event event;
Uint32 start;
Uint32 FPS = 30;
SDL_Init(SDL_INIT_EVERYTHING);
screen = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
init();
while(isRunning)
{
start = SDL_GetTicks();
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT: isRunning = 0; break;
}
}
display();
SDL_GL_SwapBuffers();
if(1000 / FPS > SDL_GetTicks() - start)
{
SDL_Delay(1000 / FPS - (SDL_GetTicks() - start));
}
}
SDL_Quit();
return(0);
}
答案 0 :(得分:2)
我注意到你没有包含对glewInit()的调用,如果你打算使用glew,请确保在使用它提供的任何openGL函数指针之前调用它。
答案 1 :(得分:1)
您是否真的链接到GLEW库?简单地告诉VS目录的位置是不够的;你必须告诉它链接到哪个库。
测试是否链接到库的快速方法是删除它并重新编译。如果VC没有抱怨无法找到特定的库,那么你就没有链接到它。
另外,像我为GLEW所做的那样,简单地将SDL安装到我的VC inc和lib和System32目录是一个好主意吗?
在那里安装GLEW并不是一个好主意,更不用说其他任何东西了。 Visual Studio与Linux安装不同;没有库和标头的全局存储库。您可以将VS项目指向特定的库和头文件(如果需要,甚至可以全局设置它们)。保留VS目录。
答案 2 :(得分:1)
glGenBuffers第二个参数是指向GLuint(GLuint )的指针,而不是指向GLuint指针的指针(GLuint * ,这是你传递的)。相反,这样做:
Uint32 vboId;
glGenBuffers(1, &vboId);