本页详细介绍了 SharpGL 的最基本概念,在开始开发应用程序时必须了解这些概念。
命名约定
OpenGL 常量的命名方式与它们在 OpenGL 中的命名方式完全相同,并且是 OpenGL 类的常量成员。例如,以下常量:
// Two OpenGL constants.
GL_TRIANGLES
GLU_TESS_COMBINE
将写成:
// Two OpenGL constants.
OpenGL.GL_TRIANGLES
OpenGL.GLU_TESS_COMBINE
OpenGL 函数的命名方式与它们在 OpenGL 中的命名方式完全相同 - 只是删除了 'gl' 前缀。例如,以下调用:
// Set the line width and point size.
glLineWidth(3.0f);
glPointSize(2.0f);
将写成:
// Get a reference to the OpenGL object.
OpenGL gl = openGLCtrl1.OpenGL;
// Set the line width and point size.
gl.LineWidth(3.0f);
gl.PointSize(2.0f);
此规则有一个例外。参数类型后缀始终从 OpenGL 函数名称中删除。始终根据所使用的类型调用适当的函数。例如,以下调用:
// Set the color.
glColor3f(0.5f, 0.5f, 0.5f);
// Output some vertices.
glVertex3f(2.0f, 3.0f 4.0f);
glVertex4f(2.0f, 1.0f, 10.0f, 1.0f);
将写成:
// Set the color.
gl.Color3(0.5f, 0.5f, 0.5f);
// Output some vertices.
gl.Vertex3(2.0f, 3.0f 4.0f);
gl.Vertex4(2.0f, 1.0f, 10.0f, 1.0f);
参数的数量包含在函数名称的末尾,就像在标准 OpenGL 调用中一样。这是因为在某些情况下,我们仍然需要知道这一点 - 例如,在调用 glVertex3fv 或 glVertex4fv 时,我们需要知道我们正在传递数组中的多少项。因此,如果 OpenGL 函数末尾有数字,则为了保持一致性,SharpGL 包装函数也是如此。
调用 OpenGL 函数
有两种不同的方法可以调用 OpenGL 函数。
直接 OpenGL 调用
您可以直接使用 OpenGL 对象进行 OpenGL 调用。OpenGL 中的每个函数和所有扩展函数都包含在 OpenGL 对象中。所有常量也被定义。在本例中,一段代码如下所示:
// Set the polygon mode.
glPolygonMode(GL_FRONT, GL_FILL);
将变为:
// Get the OpenGL object.
OpenGL gl = openGLControl.OpenGL;
// Set the polygon mode.
gl.PolygonMode(OpenGL.GL_FRONT, OpenGL.GL_FILL);
这是进行 OpenGL 调用的最直接方法,并且使移植现有 OpenGL 代码变得非常简单。
使用包装枚举的直接 OpenGL 调用
几乎所有采用某种 uint 的 OpenGL 函数(如 glPolygonMode)都具有提供枚举作为参数的重载。例如,下面的调用:
// Set the polygon mode.
glPolygonMode(GL_FRONT, GL_FILL);
可以写成:
// Get the OpenGL object.
OpenGL gl = openGLControl.OpenGL;
// Set the polygon mode.
gl.PolygonMode(PolygonFace.Front, PolygonMode.Fill);
此方法的好处是,在编写代码时,Intellisense 可以帮助您仅从可接受的参数中选择适当的参数。但是,此代码与标准 OpenGL 调用不太相似,因此可能需要更多的工作才能将现有调用移植到此样式。
渲染上下文
Render Context 是管理底层 Render Context Handle 的对象。在创建渲染上下文之前,任何 OpenGL 函数都不会起作用 - 并且不会加载任何扩展。调用 OpenGL.Create 将创建渲染上下文 - 完成此作后,可以使用扩展,但在此之前,它们将不起作用。