C++ OpenGL: вызов gluPerspective вызывает ошибку неопределенной ссылки?

Я использую FreeGLUT, чтобы попытаться создать свой первый куб на C++ с OpenGL. У меня проблема: всякий раз, когда я вызываю «gluPerspective», компилятор выдает эту ошибку:

build/Debug/MinGW-Windows/main.o: In function `main':
C:\Users\User\Dropbox\NetBeans Workspace\Testing/main.cpp:47: undefined reference to `gluPerspective@32'

Я огляделся, чтобы узнать, была ли у кого-нибудь эта проблема, и ничего не нашел. Так что, кажется, я снова чего-то не замечаю. Здесь я вызываю функцию:

......
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45, 1.333, 1, 1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
......

Включаю freeGLUT и все остальное работает кроме этой строчки. Я проверил документацию, и кажется, что я использую ее правильно. Я в растерянности.


person CoderTheTyler    schedule 10.02.2013    source источник
comment
Прежде чем я отвечу на вопрос, который вы получили: зачем использовать конвейер с фиксированной функцией? FFP устарел.   -  person Felix K.    schedule 10.02.2013
comment
Я просто пытаюсь пройти базовый рабочий тест, прежде чем переходить к шейдерам и многому другому.   -  person CoderTheTyler    schedule 10.02.2013


Ответы (1)


gluPerspective был удален из GLU (вспомогательной библиотеки OpenGL) в версии 3.1. Вы компилируете с правильной библиотекой, которая все еще определена? Если нет, то вам нужно будет написать свою собственную версию и передать матрицу напрямую в OpenGL.

OpenGL.org имеет код gluPerspective на своем веб-сайте (представлен здесь для полноты):

//matrix will receive the calculated perspective matrix.
//You would have to upload to your shader
// or use glLoadMatrixf if you aren't using shaders.
void glhPerspectivef2(float *matrix, float fovyInDegrees, float aspectRatio,
                      float znear, float zfar)
{
    float ymax, xmax;
    float temp, temp2, temp3, temp4;
    ymax = znear * tanf(fovyInDegrees * M_PI / 360.0);
    //ymin = -ymax;
    //xmin = -ymax * aspectRatio;
    xmax = ymax * aspectRatio;
    glhFrustumf2(matrix, -xmax, xmax, -ymax, ymax, znear, zfar);
}
void glhFrustumf2(float *matrix, float left, float right, float bottom, float top,
                  float znear, float zfar)
{
    float temp, temp2, temp3, temp4;
    temp = 2.0 * znear;
    temp2 = right - left;
    temp3 = top - bottom;
    temp4 = zfar - znear;
    matrix[0] = temp / temp2;
    matrix[1] = 0.0;
    matrix[2] = 0.0;
    matrix[3] = 0.0;
    matrix[4] = 0.0;
    matrix[5] = temp / temp3;
    matrix[6] = 0.0;
    matrix[7] = 0.0;
    matrix[8] = (right + left) / temp2;
    matrix[9] = (top + bottom) / temp3;
    matrix[10] = (-zfar - znear) / temp4;
    matrix[11] = -1.0;
    matrix[12] = 0.0;
    matrix[13] = 0.0;
    matrix[14] = (-temp * zfar) / temp4;
    matrix[15] = 0.0;
}
person ChrisF    schedule 10.02.2013
comment
Может быть, это бывший. Последнее вообще не помогает. Но я компилирую с последней версией FreeGLUT и OpenGL 3.3.0. Как мне обойти это? - person CoderTheTyler; 10.02.2013
comment
@MrDoctorProfessorTyler - я искал и нашел пример, но не могу найти его снова. (Я также удалил неверную часть ответа). - person ChrisF; 10.02.2013
comment
Думаю, я просто поищу вокруг. Есть ли в OpenGL матричный класс или мне придется создать свой собственный? - person CoderTheTyler; 10.02.2013
comment
@MrDoctorProfessorTyler - у него все еще есть матричный класс, и я нашел код. - person ChrisF; 10.02.2013
comment
Спасибо! Это действительно большая помощь :D - person CoderTheTyler; 10.02.2013
comment
gluPerspective никогда вообще не был частью OpenGL. Он был частью GLU, сопутствующей вспомогательной библиотеки, которая поставлялась с OpenGL-1.x, но не являлась ее частью. - person datenwolf; 10.02.2013
comment
Все равно не правильно. Дело в том, что библиотека GLU никогда не обновлялась с момента ее выхода. А теперь OpenGL его перерос и он уже не подходит. - person datenwolf; 10.02.2013