OpenGL弃用函数和gluPerspective与Transform

3
我是OpenGL的新手,仍在尝试基本形状。我有时会发现许多函数(如“ glend”等)在OpenGL 3+文档中没有提到。它们被其他函数取代了吗?还是我必须手动编写它们?是否有在线教程使用OpenGL 3+?
至于“ gluPerspective”,我读到它在OpenGL 3+中不再使用。它不应该是GLUT中的一个单独函数吗?它与OpenGL 3+有什么关系?最后,“ Transform(Width,Height)”是干什么用的呢?(我在下载的一些示例代码中找到了它,但在GLUT或OpenGL中找不到它。)
以下是代码:
GLvoid Transform(GLfloat Width, GLfloat Height)
{
  glViewport(00, 00, Width, Height);              /* Set the viewport */
  glMatrixMode(GL_PROJECTION);                  /* Select the projection matrix */
  glLoadIdentity();             /* Reset The Projection Matrix */
  gluPerspective(20.0,Width/Height,0.1,100.0);  /* Calculate The Aspect Ratio Of The Window */
  glMatrixMode(GL_MODELVIEW);                   /* Switch back to the modelview matrix */
}


/* A general OpenGL initialization function.  Sets all of the initial parameters. */
GLvoid InitGL(GLfloat Width, GLfloat Height)    
{
  glClearColor(0.0, 0.0, 0.0, 0.0);     /* This Will Clear The Background Color To Black */
  glLineWidth(2.0);                             /* Add line width,   ditto */
  Transform( Width, Height );                   /* Perform the transformation */
}

/* The function called when our window is resized  */
GLvoid ReSizeGLScene(GLint Width, GLint Height)
{
  if (Height==0)    Height=1;                   /* Sanity checks */
  if (Width==0)      Width=1;
  Transform( Width, Height );                   /* Perform the transformation */
}
2个回答

4
我有时会发现许多函数,如glEnd等,在OpenGL 3+文档中没有提到。它们被其他函数替换了吗?
它们已经完全被删除,因为它们的工作方式与现代图形系统在硬件和软件方面的工作方式不符合。glBegin(...)和glEnd()形成了所谓的立即模式的周围:每个调用都会导致一个操作。这反映了20年前早期图形系统的构建方式。
今天,人们准备数据批次,将它们传输到GPU内存,并通过单个绘图调用触发批次绘制。OpenGL通过顶点数组和顶点缓冲对象(VBO)来实现这一点。顶点数组自OpenGL-1.1(1996)以来就存在了,而VBO API则是基于顶点数组的,因此对于任何合理的程序,VBO支持很容易添加。
还是需要手动编写它们吗?有没有在线教程使用OpenGL 3+?
这取决于所涉及的函数。例如,整个纹理环境、组合器已被删除。就像矩阵操作函数和整个光照接口一样。
现在通过着色器和uniforms来完成它们的功能和配置。由于你需要提供着色器,因此可以说,你需要自己实现这些功能。另一方面,你很快就会发现,编写着色器通常比调整大量OpenGL参数设置调用更容易和简洁。而且一旦你进展到足够高的水平,你几乎不会错过矩阵操作函数。每个处理3D图形的严肃应用程序都自己维护变换矩阵;无论是为了增强灵活性还是因为这些矩阵在其他地方也需要使用,例如某些物理模拟。
至于“gluPerspective”,我已经读到它在Opengl 3+中没有使用。它不应该是GLUT中的单独函数吗?它与OpenGL 3+有什么关系?最后,“Transform(Width,Height)”做了什么?(我在下载的一些示例代码中找到它,在GLUT或OpenGL中找不到)
gluPerspective是GLU的一部分。GLU是OpenGL实用函数的伴随库,曾经随OpenGL-1.1一起发布。但它不是OpenGL规范的一部分,完全是可选的。
GLUT是另一回事。它是一个简化的框架,用于快速而简单地设置OpenGL窗口和上下文,并提供一些极简输入API。此外,它已经不再得到积极维护。个人建议不要使用它。如果您必须使用GLUT API,请使用FreeGLUT。或者更好的是,不要使用GLUT,而是使用像Qt、GTK这样的工具包或GLFW、SDL这样的框架。

谢谢提供的信息。关于freeGLUT和GLUT不是一样的吗?我在我的程序中使用“#include <GL/glut.h>”,而且GLUT API似乎与freeGLUT相同... - Trt Trt
另外我想问的是,如果我使用glBegin和glEnd,那么我就没有使用OpenGL 3+了,对吗?我会自动退回到旧版本的OpenGL吗? - Trt Trt
@datenwolf:因为我的图形驱动程序支持OpenGL 3.3,但我能够运行“glBegin/glEnd”,所以这让我有点困惑。 - Trt Trt
@TrtTrt:OpenGL-3上下文必须显式请求。如果您获得了OpenGL-3兼容性配置文件上下文,则立即模式仍将起作用。此外,您始终可以编译和链接使用glBegin/glEnd的程序。是否创建OpenGL-3上下文是在运行时决定的。 - datenwolf
@datenwolf: 编译器是否有办法检查我是否仅使用OpenGL Core 3+功能? - Trt Trt
显示剩余3条评论

2

它们被其他函数替换了吗?

没有。

还是我必须手动编写它们?

对于旧式立即模式几何图形提交,您需要自己制作类似的工具。矩阵堆栈有一个替代品

有使用OpenGL 3+的在线教程吗?

至少有一个


谢谢,这是一个非常棒的教程! - freakinpenguin

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