图形管道
在OpenGL中所有物体处在3D空间中,但屏幕和窗口是一个2D像素数组,因此OpenGL工作的很大一部分是将所有3D坐标转换为适合您屏幕上的2D像素。将3D坐标转换为2D像素的过程由OpenGL的图形管道管理。图形管道可分为两大部分:第一部分将3D坐标转换为2D坐标,第二部分将2D坐标转换为实际彩色像素。在本教程中,我们将简要讨论图形管道,以及如何利用它来创建花哨的像素。
图形管道将一组3D坐标作为输入,并将这些坐标转换为屏幕上的彩色2D像素。图形管道可分为几个步骤,其中每个步骤都需要上一步的输出作为输入。所有这些步骤都是高度专业化的(它们具有一个特定的功能),并且可以很容易地并行执行。由于其具有并行性特点,当今的图形卡具有数千个小型处理内核,通过为管道的每个步骤在GPU上运行小型程序,在图形管道中快速处理数据。这些小程序称为着色器。
其中一些着色器由开发人员配置,这允许我们编写自己的着色器来替换现有的默认着色器。这为我们提供了对管道特定部分的更细粒度的控制,并且由于它们在GPU上运行,因此还可以为我们节省宝贵的CPU时间。着色器以OpenGL着色语言(GLSL)编写,我们将在下一教程中深入探讨这一点。
下面您将找到图形管道所有阶段的抽象表示形式。

具有蓝色背景的部分是可编程的,并且具有灰色背景的部分可以使用函数轻轻自定义。步骤如下:
- 顶点着色器:顶点移动到位置。这是应用模型位置等位置的位置。
- 形状拼接。在这个阶段,
OpenGL的工作原理是将顶点拼接到三角形中; - 几何着色器:过程的可选阶段。允许您从形状装配体微调结果。
- 栅格化:三角形转换为碎片。
- 线段着色器:对线段进行修改,以包括颜色数据等内容。这是纹理和照明,除其他外,应用的地方。
- 测试和混合:片段着色器的结果与场景的其余部分集成。
这些可能看起来很繁琐,但一旦设置完成,我们进入管道,它是相当直观的。
一些新的函数
我们需要重写几个额外的函数才能开始。首先,我们重写OnLoad函数。
protected override void OnLoad(EventArgs e)
{
GL.ClearColor(0.2f, 0.3f, 0.3f, 1.0f);
base.OnLoad(e);
}
当窗口首次打开时,此函数将运行一次。任何初始化相关的代码都应转到此处。
同时在这里,我们得到我们OpenGL调用的第一个函数:GL.ClearColor。这需要四个浮点,范围在0.0f和1.0f之间。这将决定在窗口在帧之间清除后的颜色。
之后,我们需要重写OnRenderFrame。
protected override void OnRenderFrame(FrameEventArgs e)
{
GL.Clear(ClearBufferMask.ColorBufferBit);
Context.SwapBuffers();
base.OnRenderFrame(e);
}
我们这里有两个调用。首先,GL.Clear使用OnLoad中设置的颜色清除屏幕。这应始终是呈现时调用的第一个函数。
之后我们使用Context.SwapBuffers。几乎任何现代OpenGL上下文都是所谓的"双缓冲"。双缓冲意味着OpenGL绘制到的两个领域。本质上:显示一个区域,而另一个区域用来展示。然后,当您调用交换缓冲区时,两者将反转。单缓冲上下文可能会有屏幕卡顿等问题。
现在我们重写OnResize
protected override void On

最低0.47元/天 解锁文章
1594

被折叠的 条评论
为什么被折叠?



