我可以设置 openGL 缓冲区以按照与 OBJ 文件类似的原理工作吗?

Posted

技术标签:

【中文标题】我可以设置 openGL 缓冲区以按照与 OBJ 文件类似的原理工作吗?【英文标题】:Can I setup openGL buffers to work on similar principle as OBJ files? 【发布时间】:2015-07-09 02:57:04 【问题描述】:

假设我有以下数组(每个数组都有任意长度)并将它们用作备件箱;将它们中的每一个放入缓冲区中,然后让 openGL 读取元素数组中的索引,并通过从每个数组 bin 中挑选来构造顶点。

我们可以使用 构造一个顶点 坐标v1,正常vn3,颜色c1,texCoord vt4

或者我们可以使用构造另一个顶点 再次坐标v1,再次正常vn3,颜色c3,texCoord vt2

注意,“坐标数组”还不是一个顶点,它只是提供一个位置来构造一个顶点。

在使用缓冲区和着色器的现代 openGl 中,这样的事情会非常困难(对于初学者来说)吗?

坐标数组: v 1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v -1.000000 -1.000000 1.000000 v -1.000000 -1.000000 -1.000000 v 1.000000 1.000000 -1.000000 v 0.999999 1.000000 1.000001 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000

NormalsArray: vn 0.000000 0.000000 -1.000000 vn -1.000000 -0.000000 -0.000000 vn -0.000000 -0.000000 1.000000 vn -0.000001 0.000000 1.000000 vn 1.000000 -0.000000 0.000000 vn 1.000000 0.000000 0.000001

调色板: c 1.0,1.0,1.0 c 0.0,1.0,0.0 c 0.2,0.3,0.2

TextureCoordArray: 0.748573 0.750412 0.749279 0.501284 VT 0.999110 0.501077 VT 0.999455 0.750380 VT 0.250471 0.500702 VT 0.249682 0.749677 vt 0.001085 0.750380 VT 0.001517 0.499994 VT 0.499422 0.500239 VT 0.500149 0.750166 VT 0.748355 0.998230 VT 0.500193 0.998728 vt 0.498993 0.250415 vt 0.748953 0.250920

IndexRecipiesArray: f 1,2,1,4, 2,2,1,4, 3,2,1,4 f 2,2,1,4, 3,2,1,4, 4,2,1,4 f 4,5,1,4, 5,2,1,4, 6,2,1,4 f 6,2,1,4, 7,2,1,4, 8,2,1,4 f 1,2,1,4, 1,2,1,4, 1,2,1,4

【问题讨论】:

【参考方案1】:

这已经以类似的形式出现过很多次了。但是我找不到确切的副本,所以无论如何我都会回答。

OpenGL 不直接支持这一点。它只能有一个索引数组,这意味着您需要为每个唯一的属性组合提供一个顶点。

有一个相当接近的扩展:AMD_interleaved_elements。它确实引入了每个属性索引的概念。但是使用它有几个问题:

顾名思义,它是特定于供应商的。因此,您不能将其用作您支持的唯一渲染路径,除非您的代码只能在有限的硬件上运行。 它有严重的限制。它只支持两个 16 位索引或四个 8 位索引。由于两个索引对于您描述的情况是不够的,因此每次绘制调用将被限制为 256 个顶点。对于任何有趣的事情来说,这很少是足够的。

因此,典型的方法是在将顶点数据提供给 OpenGL 之前,在您自己的代码中生成唯一的属性组合和相应的索引。我在回答这个问题时发布了一些用于此任务的伪代码:OpenGL - Index buffers difficulties。

【讨论】:

谢谢先生!这直接证实了我所害怕的。基于此,我将不得不从头开始重新考虑我的设计策略。

以上是关于我可以设置 openGL 缓冲区以按照与 OBJ 文件类似的原理工作吗?的主要内容,如果未能解决你的问题,请参考以下文章

opengl 在屏幕上渲染之前旋转对象以设置其正确的面

OpenGL/C++:使用顶点缓冲区进行从后到前渲染

转换浮点数组中的 blend 或 obj 文件以在 OpenGL 中绘图

了解现代 OpenGL 中的代码绘制 .obj 并设置不同的位置

在 OpenGL 中,(如何)我可以在两个深度缓冲区之间进行深度测试?

OpenGL中的多个渲染目标与Cg