glGetIntegerv возвращает значение мусора - PullRequest
4 голосов
/ 06 июля 2011
#include<iostream>
#include"Glew\glew.h"
#include"freeGlut\freeglut.h"
using namespace std;

int main(int argc, char* argv[])
{
    GLint ExtensionCount;
    glGetIntegerv(GL_NUM_EXTENSIONS, &ExtensionCount);
    cout << ExtensionCount << endl;

    return 0;
}
  1. Вывод этой программы: -858993460. Зачем? Должно возвращаться количество поддерживаемых расширений.

  2. Если я удаляю заголовочный файл freeglut.h, программа не запускается и выдает сообщение об ошибке,

error LNK2019: unresolved external symbol __imp__glGetIntegerv@8 referenced in function _main

Но glGetIntegerv внутри glew.h. Почему удаление freeglut.h может привести к неразрешенной внешней ошибке?

РЕДАКТИРОВАТЬ У меня есть поддержка OpenGL 3.3. Использование Radeon 4670 с катализатором 11.6.

Ответы [ 5 ]

10 голосов
/ 06 июля 2011

@ mario & @Banthar да, спасибо. Сначала я должен создать контекст, чтобы использовать любые функциональные возможности Opengl (да, даже для Opengl 1.1, который поставляется по умолчанию с окнами).

glGetIntegerv не возвращает мусор. glGetIntegerv возвращает либо хорошее значение, либо оно вообще не касается указанного адреса. Причина, по которой вы видите мусор, заключается в том, что переменная не инициализирована. Это похоже на педантичный комментарий, но на самом деле важно знать, что glGetIntegerv не трогает переменную, если она терпит неудачу. Спасибо @ Дэймон

Эта голая кость отлично работает.

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);

    glutInitContextVersion(3,3);
    glutInitContextProfile(GLUT_FORWARD_COMPATIBLE);
    glutInitContextProfile(GLUT_CORE_PROFILE);

    glutCreateWindow("Test");

    GLint ExtensionCount;
    glGetIntegerv(GL_NUM_EXTENSIONS, &ExtensionCount);
    cout << ExtensionCount << endl;

    return 0;
}
2 голосов
/ 06 июля 2011

Вы уверены, что у вас есть opengl 3.0? AFAIK, GL_NUM_EXTENSIONS был добавлен в OpenGL 3.0.

2 голосов
/ 06 июля 2011

Полагаю, ваш контекст рендеринга использует версию OpenGL до 3.0 (из того, что я прочитал, GL_NUM_EXTENSIONS была представлена ​​в OpenGL 3.0; только потому, что ваша карта поддерживает ее, не означает, что вы на самом деле ее используете). Вы можете получить строку GL_EXTENSIONS, а затем разделить / посчитать элементы самостоятельно. Но я не думаю, что это доступно везде (2.0 +?).

Что вы пытаетесь сделать (помимо возврата количества добавочных номеров)?

0 голосов
/ 01 июня 2012

В моем Windows SDK (7.1) включенный GL/GL.h определяет символ GL_VERSION_1_1.Я подозреваю, что эта версия действительно актуальна для целей использования glGetIntegerv с такими аргументами, как GL_MAJOR_VERSION, GL_MINOR_VERSION или GL_NUM_EXTENSIONS.

На самом деле, ни одна из них не определена в GL/GL.h, в то время как, например, GL_VERSION и GL_EXTENSIONS.Но при включении GL/glew.h все эти константы доступны.

Что касается GL_VERSION_1_1, три константы GL_MAJOR_VERSION, GL_MINOR_VERSION или GL_NUM_EXTENSIONS не являются допустимыми значениями перечисления, и фактически, если вы вызываетеglGetError после попытки использовать один из них с glGetIntegerv вы получите ошибку 0x500 (1280 в десятичном формате), которая является ошибкой GL_INVALID_ENUM.

0 голосов
/ 06 июля 2011

Возможно, заголовки вашей библиотеки ожидают, что вы включите <GL/gl.h>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...