GL_MULTISAMPLE被定义在哪里?

7
尽管我被劝阻不要读OpenGL红皮书,但我仍在读,因为它是专门为初学者设计的书籍,而教程和/或文档并不能完全替代一本书,尽管它们非常重要。所以就这样为自己辩护吧 :)
现在,有一个使用多重采样进行抗锯齿的例子,其中涉及到glEnable(GL_MULTISAMPLE); 我正在使用Qt,但我遇到了编译错误,因为GL_MULTISAMPLE是未声明的标识符。我目前看到以下原因:
  • 对于一些实现(包括随Qt一起提供的实现),GL_MULTISAMPLE没有定义。
  • 它不在GL/gl.h或GL/glu.h中,而是在一些其他头文件中,该头文件没有包含在<QGLWidget>中,也没有随Qt一起提供。
  • 它已过时/弃用。
以上哪一种原因是正确的?如果不是,我没有它的原因是什么,我该如何获得?先感谢您。

除了《红皮书》之外,还有许多OpenGL书籍,其中大部分对于初学者来说更好。 - stonemetal
@stonemetal:你会推荐哪个? - Armen Tsirunyan
我不确定为什么有人会劝阻你阅读它,我认为这是一本涉及核心概念的优秀书籍。 - Aaron H.
如果您只需要学习API,我建议阅读《OpenGL超级圣经》。如果您对计算机图形一无所知,并且需要了解更多有关数学方面的内容,请阅读Hill和Kelley的《使用OpenGL的计算机图形学》。 - stonemetal
4个回答

6

由于您说使用了Qt的库,因此可能不需要GLEW等库,因为Qt会为您封装和绑定扩展。

如果您正在使用QGLWidget,那么这将特别容易。请查看随Qt一起提供的this example,它使用GL_MULTISAMPLE,特别是定义了glwidget.cpp文件:

#ifndef GL_MULTISAMPLE
#define GL_MULTISAMPLE  0x809D
#endif

如果您想自定义FSAA样本,请将自己的QGLFormat传递给QGLWidget构造函数,例如:
QGLFormat format;
format.setDoubleBuffer(true);
format.setDepth(false);
format.setAlpha(false);
format.setSampleBuffers(true);
format.setSamples(4);
QGLWidget *glw = new QGLWidget(format);

format.setSamples(4)更改为您喜欢的设置。确保在呈现场景之前,在您的paintGL()函数中添加glEnable(GL_MULTISAMPLE)


4

GL_MULTISAMPLE曾经是OpenGL的扩展,直到1.3版本,它是否被实现取决于您的硬件/驱动程序/供应商实现。实际上,您可能想使用GL_MULTISAMPLE_ARB。如果您正在Windows平台上,提供的OpenGL头文件将不包括此宏。

另请参阅:

RA的响应将简化扩展处理-我更喜欢使用GLee,但它们几乎可以互换(并且GLee进行了延迟初始化,这有助于我在Solaris上解决关键问题),但GLEW保持更为更新(现在Kos已经引起了我的注意,GLee已经过时)。


嗯...那应该是“曾经是”一个扩展,多重采样现在已经成为OpenGL核心的一部分了。顺便问一下,GLee现在是否保持更新?现在有GLEW和GL3W,它们没有“惰性初始化”,但与GL 4.1保持最新。 - Kos
@Kos - 感谢您的评论。看了一下GLee,它现在已经过时了,但我上次使用它是在最后一个版本发布时(2009年末左右)。我用GLEE替换了GLFW,特别是因为GLEE提供了Lazy Init,而我没有时间修复的软件错误是由于开发人员创建/销毁/重新创建GL上下文,这在定制的Solaris端口上并不顺利。GLEE的lazy init拯救了公司。 :) - wkl

3

那么,GL_MULTISAMPLE不在核心OpenGL库中? - Armen Tsirunyan
多重采样功能在OpenGL 1.3版本中被添加,你的GL头文件可能只支持OpenGL 1.1。 - Andreas Brinck
+1,GLEW是一个可靠的解决方案(除非你想使用OpenGL核心配置文件...不知道为什么GLEW开发人员仍然无法正确支持它)。 - Kos

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接