当前位置: 首页 > 知识库问答 >
问题:

我可以设置 openGL 缓冲区以使用与 OBJ 文件类似的原理吗?

张宝
2023-03-14

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

我们可以使用 {坐标 v1,
法线 vn3, 颜色 c1, texCoord vt4} 构造一个顶点

或者我们可以使用< br > {再次使用坐标v1,再次使用法线vn3,颜色c3,texCoord vt2}构建另一个顶点

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

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

坐标阵列:
v 1.000000-1.00000-1.00000
v1.000000-10000001.0000
v-1.000000-10.00000
v 1.0000000-1.00000-1000000
v1.000000 1.000000-1100000
v 0.999999 1.000000-10000 1
v-1.0000001.0000001

正常阵列:
vn 0.000000 0.000000-1.00000
vn-1.0000000-0.000000-0.00000
vn-0.000000-1.000000
vn-0.0000001 0.000000 1.000000
vn 1.000000-0.000000.00000

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


0.3,0.2

纹理坐标阵列:
vt 0.748573 0.750412
vt 0.749279 0.501284
vt 0.999110 0.501077
VR 0.999455 0.750380
VL 0.250471 0.500702
VH 0.249682 0.749677
VS 0.001085 0.750280
VD 0.001517 0.499994
VP 0.499422 0.500239
VB 0.500149 0.750166
VER 0.748355 0.998230
VO 0.500193 0.998728
vt 0.498993 0.250415
vt 0.748953 0.250920

索引收件人数组:
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,2,1,4}、{1,2,1,4}

共有1个答案

蒋弘致
2023-03-14

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

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

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

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

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

 类似资料:
  • 以下是我的情况: 我已经编写了一个小型的延迟3D引擎,使用MRT(多渲染目标)填充我的G缓冲区(同时填充我的所有位置、法线、颜色和镜面反射纹理)。 此外,我还在我的G-Buffer FBO上附加了一个渲染缓冲区对象(RBO),该对象初始化为GL_DEPTH_STENCIL_ATTACHMENT(GL_DEPTH24_STENCIL8)。因此,在G缓冲区执行期间,我的4个纹理同时被填充,渲染缓冲区同

  • 问题内容: 我只是将.m文件更改为.mm并使用C ++。有没有办法用Swift做同样的事情? 问题答案: 不。当您从.m切换到.mm时,您实际上是在从Objective-C切换到另一种称为Objective-C 的语言。因此,您并不是真正在使用C 。您使用的是Objective-C ,它接受大多数C 作为输入(与C 接受大多数但不是全部C作为输入的方式相同)。当我说它不是完全C 时,请考虑一个C

  • 我已经找了几个小时来解决我的问题。首先我有高清7800系列amd GPU,最新的驱动程序。 我正在尝试创建一个framebuffer类,它拥有我需要的所有framebuffer函数。看起来我让renderbuffers开始工作了,但绘制到纹理会导致非常奇怪的错误。 GLCHECKFRAMEBERSTATUS在两次检查时返回GL_FRAMEBUFFER_Completed_附件。createDept

  • 我做了一个在上面渲染天空盒和粒子的应用程序。我想添加一些效果,我需要使用帧缓冲区来渲染天空盒、粒子颜色、深度和位置以分离纹理。然后我想使用简单的着色器来使用这些纹理中的值并以适当的方式混合它们。我为纹理、帧缓冲区和屏幕四边形(渲染简单的矩形)编写了辅助类,但不幸的是——当我尝试使用它时没有任何渲染。 当绑定帧缓冲区被注释掉时,我的场景如下所示: 修改着色器表明深度和位置值计算正确。因此问题在于纹理

  • 在DirectX中,您可以有单独的渲染目标和深度缓冲区,因此可以绑定渲染目标和一个深度缓冲区、执行一些渲染、移除深度缓冲区然后使用旧的深度缓冲区作为纹理进行更多渲染。 你会如何在opengl中做到这一点?根据我的理解,您有一个帧缓冲区对象,其中包含颜色缓冲区和可选的深度缓冲区。我不认为我可以同时绑定多个帧缓冲器对象,我是否必须在每次更改时(可能一帧几次)重新创建帧缓冲器对象?普通的 opengl

  • 我对openGL渲染很陌生,无论我做什么,深度深度都不起作用。我显然已经启用了深度测试(),并且我清除了每一帧的缓冲区。 但是 openGL 不断显示最后在其他人面前渲染的对象... 你可以在我的github上看到我的代码。这是两个相关的文件:主循环。我的主循环在,渲染在。 我正在使用java和lwjgl。