C++ glGetIntegerv返回垃圾值 #包括 #包括“Glew\Glew.h” #包括“freeGlut\freeGlut.h” 使用名称空间std; int main(int argc,char*argv[]) { 闪烁扩展计数; glGetIntegerv(GL\u NUM\u扩展和扩展计数); 可能您的库标题希望您包含

C++ glGetIntegerv返回垃圾值 #包括 #包括“Glew\Glew.h” #包括“freeGlut\freeGlut.h” 使用名称空间std; int main(int argc,char*argv[]) { 闪烁扩展计数; glGetIntegerv(GL\u NUM\u扩展和扩展计数); 可能您的库标题希望您包含,c++,opengl,C++,Opengl,您确定有opengl 3.0吗?好的,opengl 3.0中添加了GL_NUM_扩展。我猜您的渲染上下文使用的是opengl 3.0之前的版本(据我所知,GL\u NUM\u EXTENSIONS是在OpenGL 3.0中引入的;仅仅因为您的卡支持它并不意味着您实际上正在使用它)。您可以检索字符串GL\u EXTENSIONS,然后自己拆分/计算元素。但我认为这也不是无处不在的(2.0+?) 除了返回扩展的数量,你还想做什么?@mario&@Banthar是的,谢谢。我必须先创建一个上下文来使用

您确定有opengl 3.0吗?好的,opengl 3.0中添加了GL_NUM_扩展。

我猜您的渲染上下文使用的是opengl 3.0之前的版本(据我所知,
GL\u NUM\u EXTENSIONS
是在OpenGL 3.0中引入的;仅仅因为您的卡支持它并不意味着您实际上正在使用它)。您可以检索字符串
GL\u EXTENSIONS
,然后自己拆分/计算元素。但我认为这也不是无处不在的(2.0+?)


除了返回扩展的数量,你还想做什么?

@mario&@Banthar是的,谢谢。我必须先创建一个上下文来使用任何Opengl功能。(是的,即使是windows默认的Opengl 1.1。)

glGetIntegerv没有返回垃圾。glGetIntegerv返回一个良好的值,或者它根本不触及指向的地址。看到垃圾的原因是变量未初始化。这看起来像是一个迂腐的注释,但实际上重要的是要知道,如果变量失败,glGetIntegerv不会触及该变量。Thanks@Damon

这根裸露的骨头很好用

#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;
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitContextVersion(3,3);
glutInitContextProfile(GLUT_向前兼容);
glutInitContextProfile(GLUT_核心_配置文件);
测试窗口(“测试”);
闪烁扩展计数;
glGetIntegerv(GL\u NUM\u扩展和扩展计数);
在我的Windows SDK(7.1)中,包含的
GL/GL.h
定义了符号
GL\u VERSION\u 1\u 1
。我怀疑这是一个与使用
glGetIntegerv
GL\u MAJOR\u VERSION
GL\u MINOR\u VERSION
GL\u NUM\u EXTENSIONS
等参数相关的版本

实际上,这些都没有在
GL/GL.h
中定义,而例如
GL\u版本
GL\u扩展
都是。但是当包含
GL/glew.h
时,所有这些常量都可用


对于
GL\u VERSION\u 1\u 1
,三个常量
GL\u MAJOR\u VERSION
GL\u MINOR\u VERSION
GL\u NUM\u EXTENSIONS
都不是有效的枚举值,实际上,如果在尝试将其中一个常量与
glGetIntegerv
一起使用后调用glGetError,则会出现错误
0x500
1280
十进制)这是
GL\u INVALID\u ENUM
错误。

当您使用
glew.h
时,您不需要包含
GL.h
。您可能需要首先创建OpenGL上下文。您还需要为
GL\u NUM\u扩展
提供最新的OpengGL版本。请注意,
glGetIntegerv
不返回垃圾。
glGetIntegerv
返回垃圾要么是一个好值,要么根本不触及指向的地址。之所以会看到垃圾,是因为变量没有初始化。这似乎是一个迂腐的注释,但实际上重要的是要知道
glGetIntegerv
在变量失败时不会触及该变量。@damono不,这不是迂腐的注释。这是正确的你知道我一直在找什么。非常感谢我冒昧地在答案中添加了您的评论。是的,我有OpenGL 3.3支持。使用Radeon 4670和catalyst 11.6。您应该在我的帖子中发表评论以供提问。无论使用哪个版本,您都必须初始化OpenGL。您不能在没有有效OpenGL上下文的情况下调用随机OpenGL函数;这样做是行不通的。@nicol bolas so,如果不初始化上下文,即使OpenGL 1.1函数也无法工作?是的。如果没有上下文,就没有OpenGL。谢谢,还有一件事,请您解释一下我在问题中遇到的第二个问题。当我注释掉
freelut.h
glGetIntegerv
时,导致了一个无法解决的外部问题。为什么?@iamcreasy:您没有链接到penGL库。如果包含
freeglut.h
头文件,则程序可以运行,因为它使用
#pragma
s添加它们。
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;
}