Возникли проблемы с получением GLEW на работу - PullRequest
1 голос
/ 07 августа 2011

примечание: glGetString (GL_VERSION) вернул: 2.1.0 - сборка 8.15.10.2361

Я установил GLEW в System32 и каталоги VCDir / lib и VCDir / include. Поэтому у компоновщика не должно быть проблем с поиском необходимых битов GLEW. Но проблема в том, что следующий код:

void foo()
{
    Uint32 vboId;

    glGenBuffers(1, &vboId);
}

Дает мне следующую ошибку:

unresolved external symbol __imp____glewGenBuffers

Эта ошибка была единственной причиной, по которой я решил установить GLEW. См .: Неразрешенный внешний символ _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

Кроме того, будет ли хорошей идеей просто установить SDL в каталоги VC inc, lib и System32, как я это сделал для GLEW?

Мои # 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);
}

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

Я заметил, что вы не включили вызов glewInit (), если вы планируете использовать glew, обязательно вызовите его, прежде чем использовать какой-либо из указателей функций openGL, которые он предоставляет.

1 голос
/ 07 августа 2011

Второй параметр glGenBuffers - это указатель на GLuint (GLuint ), а не указатель на указатель на GLuint (GLuint *, который вы передаете).Вместо этого сделайте это:

Uint32 vboId;

glGenBuffers(1, &vboId);
1 голос
/ 07 августа 2011

Вы действительно ссылались на библиотеку GLEW?Просто сказать VS, где каталог не достаточно;Вы должны указать ей, на какую библиотеку ссылаться.

Быстрый способ проверить, ссылаетесь ли вы на библиотеку, - это удалить ее и перекомпилировать.Если VC не жалуется на невозможность найти определенную библиотеку, значит, вы не указали ссылку на нее.

Кроме того, стоит ли просто установить SDL на мой VC inc иКаталоги lib и System32, как я это сделал для GLEW?

Не было хорошей идеей устанавливать GLEW там, не говоря уже о чем-то еще.Visual Studio не похож на установку Linux;нет глобального хранилища библиотек и заголовков.Это зависит от вас, чтобы указать ваш проект VS на конкретные библиотеки и заголовочные файлы (вы можете даже установить их глобально, если хотите).Оставьте каталоги VS в покое.

...