【问题标题】:How do I get indexed vertex positions AND indexed vertex normals from wavefront .obj file into an OpenGL vertex shader?如何将索引顶点位置和索引顶点法线从波前 .obj 文件获取到 OpenGL 顶点着色器中?
【发布时间】:2012-12-18 07:06:28
【问题描述】:

我试图在顶点数组对象 (VAO) 中使用两个顶点缓冲区对象 (VBO) 和两个索引缓冲区对象 (IBO) 来渲染来自包含 3D 模型的波前 .Obj 文件的数据。 .obj 文件使用的是vertex/normal face definition:

f v1//vn1 v2//vn2 v3//vn3

我意识到我不能使用两个 IBO 来使用 OpenGL 的 VAO 进行索引,因为(一次)只能将一个缓冲区对象绑定到 GL_ELEMENT_ARRAY_BUFFER 绑定目标。这意味着我不能只定义顶点位置索引和顶点法线索引,当我需要两者作为 GLSL 顶点着色器的输入时,这是一个问题。

我考虑过使用“顶点”结构来封装顶点位置和顶点法线,但我不知道如何将数据作为一个长数组提供给 OpenGL,并且当我将所有顶点位置数据保存在不同的对象中时。我想我可以使用一些循环将数据复制到包含所有位置数据的新数组中。

加载 .obj 文件时,我想我可以处理数据,以便法线与相应的顶点位置值匹配。

我应该如何解决这个问题?

我正在使用 C++ 和 Visual Studio 2012 以及 OpenGL 3.3。

【问题讨论】:

    标签: c++ opengl glsl .obj


    【解决方案1】:

    您必须了解的一件事是,“顶点”不是“位置”的同义词。一个顶点是整个属性集;位置、法线、纹理坐标等。OpenGL 一次处理一个图元,其中一个图元由 1 个(点)、2 个(线)或 3 个顶点(三角形)组成。位置和法线不能分开处理,它们总是必须在一起的。

    在 OpenGL 中处理它之前,您必须扩展 .obj 文件中的数据。为每个唯一的属性元组引入一个带有新索引的新顶点,并将 .obj 中的索引属性替换为 OpenGL 所需的索引顶点。

    【讨论】:

    • 感谢您的回答,datenwolf。我现在从概念上理解它。
    • 我相信我仍然缺少一些东西。 “对于每个唯一的属性元组,引入一个带有新索引的新顶点并替换索引属性......”在一个面内,obj 中的一个顶点具有关联的法线。在另一个共享相同顶点的面内,该顶点具有不同的法线。 OpenGL中的顶点法线属性是表示每个面的每个顶点一个法线,还是表示单个顶点的单个法线,无论它属于哪个面?抱歉,发布了 necropost。
    • @JohnP:请再次阅读我回答的第一句话。如果有两个顶点位置相同,但法线不同,那么它们就是不同个顶点! Wavefront OBJ 文件是错误的,因为它们将 positions 称为“顶点”(它们不是,它们只是位置),并且面部记录索引为“顶点”和“顶点法线”记录(正确名称为记录将是“位置记录”和“正常记录”)。
    • @datenwolf 这是一个明确且非常有用的答案。你能推荐任何更详细地讨论这些问题的资源吗?
    • @algal:我手头一无所知。大多数“我们”的老式图形程序员——当它还处于技术起步阶段时就开始做这些东西——通过阅读其他人的代码并仔细思考它来学习这些东西。然后有些人继续写书。如果您遵循基本线性代数和基本计算机体系结构设计的逻辑进展,所有这些事情都会自然而然地发生。
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2017-10-17
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多