C++ glGetIntegerv返回垃圾值 #包括 #包括“Glew\Glew.h” #包括“freeGlut\freeGlut.h” 使用名称空间std; int main(int argc,char*argv[]) { 闪烁扩展计数; glGetIntegerv(GL\u NUM\u扩展和扩展计数); 可能您的库标题希望您包含
您确定有opengl 3.0吗?好的,opengl 3.0中添加了GL_NUM_扩展。我猜您的渲染上下文使用的是opengl 3.0之前的版本(据我所知,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是的,谢谢。我必须先创建一个上下文来使用
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;
}