Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绘制立方体的无Glu示例?_C#_C++_Opengl_3d_Opentk - Fatal编程技术网

C# 绘制立方体的无Glu示例?

C# 绘制立方体的无Glu示例?,c#,c++,opengl,3d,opentk,C#,C++,Opengl,3d,Opentk,我正试图回到OpenGL,但我的知识和数学现在已经生疏了。我以前用C++,但现在我更喜欢C…正在试用OpenTK。显然Glu自从GL 3.1以来就被贬低,所以我试图找到一个GLU例子,在C或C++中在屏幕上绘制立方体(我可以翻译它)。 我发现有挑战性的部分是设置视口/视角/摄影机/透视/初始化内容。我可以清理缓冲区,在3D空间中放置点,但是其他的东西我都忘了 特别是,我需要替换Glu.Perpsective和Glu.LookAt我建议看一看,它说它是OpenGL4,但这里描述的所有内容(仅到目前

我正试图回到OpenGL,但我的知识和数学现在已经生疏了。我以前用C++,但现在我更喜欢C…正在试用OpenTK。显然Glu自从GL 3.1以来就被贬低,所以我试图找到一个GLU例子,在C或C++中在屏幕上绘制立方体(我可以翻译它)。 我发现有挑战性的部分是设置视口/视角/摄影机/透视/初始化内容。我可以清理缓冲区,在3D空间中放置点,但是其他的东西我都忘了


特别是,我需要替换
Glu.Perpsective
Glu.LookAt

我建议看一看,它说它是OpenGL4,但这里描述的所有内容(仅到目前为止的基础知识)也直接适用于OpenGL3。我认为这是快速开始使用最新OpenGL版本的最佳资源。另一个非常好的资源是,它更深入一点

您必须注意,OpenGL3和更新版本忽略了固定管道。您仍然可以使用兼容性配置文件使用固定管道,但在我看来,最好学习可编程管道。这意味着不再有即时模式(例如,
glVertex3f
和类似模式)和显示列表。绘制之前,必须将顶点数据直接提交到图形卡。这是使用缓冲区对象完成的,缓冲区对象只是一个顶点数据数组。然后,您必须提交一个GLSL程序来处理这些数据,例如应用modelview和投影矩阵(即使您不需要花哨的着色器)

最后但并非最不重要的是,当前的OpenGL版本没有实现矩阵操作和照明(同样,除非使用兼容配置文件)。您需要自己创建所有矩阵,但由于这是一项乏味的工作,我建议使用外部库

这一切听起来可能很可怕,坦率地说,我发现学习可编程管道比学习固定管道更困难。然而,它给了你更多的灵活性。

从,
GLu.透视图
或多或少等同于:

98  Matrix CreateProjectionMatrix(
99      float fovy,
100     float aspect_ratio,
101     float near_plane,
102     float far_plane
103 )
104 {
105     Matrix out = { { 0 } };
106  
107     const float
108         y_scale = Cotangent(DegreesToRadians(fovy / 2)),
109         x_scale = y_scale / aspect_ratio,
110         frustum_length = far_plane - near_plane;
111  
112     out.m[0] = x_scale;
113     out.m[5] = y_scale;
114     out.m[10] = -((far_plane + near_plane) / frustum_length);
115     out.m[11] = -1;
116     out.m[14] = -((2 * near_plane * far_plane) / frustum_length);
117  
118     return out;
119 }

OpenTK有自己的数学类,包括4x4矩阵-
Matrix4
。它包括正交投影法和透视投影法-
Matrix4.CreateOrthographic(…)
矩阵4.CreatePerspectiveFieldOfView(…)还有一个lookAt方法:
Matrix4.lookAt(…)


OpenGL的OpenTK绑定接受Matrix4作为方法,如
GL.LoadMatrix()
GL.UniformMatrix4()
,等等。

如果您试图使用核心GL 3.1及更高版本,您需要的是着色器。您需要对OpenGL如何在基于着色器的世界中工作有一个坚定的理解。我建议你也读一本。公式和方法来做你需要的所有矩阵计算。哦…显然我们现在达到了4.1??还是4.2?上次我玩这个的时候,我想我们还是在2区。最好使用最新的稳定版本。除非您需要64位浮点和镶嵌,否则您不必关心4.x。@stativ:谢谢。刚刚意识到我的卡甚至不支持它。谢谢你花时间解释其中的一些差异!我只是在看一个OpenGL 3的例子,他们正是这么做的…创建了一个“VAO”和“Shader程序”…给我带来了新的概念。我想我必须先读一些书,然后才能开始。在读了OpenGL的第一章之后,我有点怀疑……看起来真的很琐碎,不需要太多的细节来解释,但我很高兴他们花时间在后面的章节中详细阐述。很好的线性代数复习!对我最近在研究中才发现这一点。谢谢但是,把它们放在
Matrix4
上似乎有点滑稽。。。这些矩阵对于OpenGL之外的应用程序来说不够通用,所以看起来它们应该是某些GL类的一部分。。。。核心OpenGL删除了所有与矩阵相关的内容,并希望用户自己做矩阵运算。它不属于
OpenTK.Graphics
名称空间的原因是因为数学类用于OpenAL绑定,并且肯定会在即将到来的OpenCL绑定中使用。啊……所以它们确实有音频应用程序,而且……无论OpenCL用于什么用途?那就够了!OpenCL(开放计算语言)使用图形卡运行通常在处理器上完成的任务,但这将受益于并行化和矢量化,因为现代GPU拥有超过500个内核,大部分指令用于处理向量。公平地说,数学类肯定偏向于OpenGL。OpenGL绑定的时间最长。