为什么OpenGL纹理会使GLint而不是GLenum?

时间:2014-05-13 00:29:58

标签: opengl

一些OpenGL纹理函数接受GLint s,我期望GLenum。例如,glTexImage2D具有以下参数:

GLint internalformat

文档描述该参数如下:

  

internalformat

     

指定纹理的内部格式。必须是以下符号常量之一:GL_ALPHA,GL_LUMINANCE,GL_LUMINANCE_ALPHA,GL_RGB,GL_RGBA。

大多数情况下,当值必须是几个符号常量之一时,API将使用GLenum。这是有道理的。但是这个(和其他一些纹理相关的参数)是GLint s。为什么呢?

当然,他们都是内心的整体,而在C中,区别并不重要。但这不是一个纯粹的学术问题。在其他更强类型语言的OpenGL绑定中,GLintGLenum之间的区别很重要,因为一个是签名而另一个不签名。例如。在Haskell OpenGLRaw包中,所有符号常量都是GLenums,这意味着每次调用fromIntegral和类似函数时,必须使用glTexImage2D显式转换。

1 个答案:

答案 0 :(得分:8)

曾几何时......如果你回到旧的OpenGL版本的文档,其中仍然记录了Core Profile中现已弃用的功能,这将是有意义的。以前为internalFormat传递值1,2,3,4是合法的,表示纹理中颜色分量的数量。

例如,这是OpenGL 2.1中glTexImage2D的手册页:http://www.opengl.org/sdk/docs/man2/xhtml/glTexImage2D.xml。在internalFormat下,它说:

  

指定纹理中的颜色分量数。必须是1,2,3或4,或以下符号常量之一:...