【问题标题】:OpenGL Modeling [closed]OpenGL建模[关闭]
【发布时间】:2012-09-14 07:58:59
【问题描述】:

我正在尝试创建允许我从 Collada 格式转换为我自己的自定义格式的程序(这部分很容易并且可以控制)。我想做的是以下。

1.) 根据从 Collada 文件中解析的确切数据,找到一种方法来绘制模型。 a.) 一个简单的立方体将生成 8 个顶点、36 个法线和 12 个纹理坐标,这是查找但我能找到的 OpenGL 绘制它的唯一方法需要我复制顶点和法线的数据以匹配法线的数量.

2.) 找到实现多重纹理的方法。 a.) 我已经找到了大量关于此的教程,但似乎我找不到实际使用它的方法。这些功能似乎没有内置到我的 openGL 版本中(我已经在 2 台计算机上尝试过),并且没有人记录我可能丢失的任何必需的 dll。

【问题讨论】:

  • 这些(多纹理)功能...哪些功能?您是指opengl 固定管道多纹理(glTexEnv 等)吗?现代 OpenGL 会在着色器中进行多重纹理处理,我发现这比搞乱纹理环境设置更直观。
  • 关于第 1 点:这应该相当简单。那么,您实际上了解多少 OpenGL?
  • 如果你不介意我问,你会如何在着色器中做呢?我对openGL很陌生,而且很不直观。我尝试过的大部分功能都围绕着 glActiveTexture() 或使用一些 GL_TEXTURE0 枚举。我不确定所有的功能,老实说,我已经尝试了一段时间,但它们似乎不是标准 OpenGL 包或 gult 的一部分。
  • 我不确定使用多个不同大小的数组有多容易。也许这在 v4 中有所改变,但我一直在使用 v3,但我没有看到不复制数据进行交错的方法。
  • 你不能使用不同大小的数组。所有数组的大小必须相同,因此您会有一些重复的数据。

标签: opengl modeling collada multitexturing


【解决方案1】:

一个简单的立方体将生成 8 个顶点、36 个法线和 12 个纹理坐标,

不,一个简单的立方体有 8 个位置,但一个顶点不仅仅是一个位置,还包含所有其他属性。所以实际上没有发生顶点重复,但你是对的,你会在属性中有一些冗余。

更新解释一下,为什么会这样

顶点是其属性的整个向量。换一个,你就有了一个完全不同的顶点。

假设您有一个顶点着色器,它采用一组纯抽象属性和一个纹理坐标

#version 150

attribute vec2 foobar;
attribute vec4 fnord;
attribute vec2 texcoord;

这个顶点着色器根据这些属性计算一些位置,比如说

void main() {
    gl_Position = vec3(fnord.xw, dot(foobar,texcoord));
}

如您所见,顶点位置现在直接取决于所有属性。但当然其他变化也可以。

为了节省冗余计算,GPU 维护了一个从顶点属性输入变换阶段/顶点着色器输出的缓存映射。如果通过索引间接访问顶点,那么缓存实际上使用索引作为键。

因此请记住:如果与顶点相关的任何内容发生更改,则您会更改整个顶点。而在现代 OpenGL 中,顶点的属性,甚至位置,最终可能会做出非常不同的事情。

这些函数似乎没有内置到我的 openGL 版本中

哦,他们可能是您的驱动程序的一部分,好吧。您可能只是没有将它们加载到您的程序中。 OpenGL DLL 仅涵盖非常基本的内容。对于其他所有内容,您必须动态加载函数指针。只需为此使用像 GLEW 这样的漂亮包装器(可在 http://glew.sourceforge.net 获得)。

【讨论】:

  • 所以你会建议简单地复制位置和纹理坐标,以便我有足够的数量来匹配正常计数?我必须承认我讨厌这个解决方案,但解决它的唯一方法是使用贬值的 glBegin 和 glEnd 东西(基本上只是画一个三角形列表。)
  • @BenjaminDangerJohnson:是的,这正是你必须做的。我确实理解你不喜欢它,但这不仅是 OpenGL 的工作方式,还有 GPU 内部的连接方式。为了节省 冗余 计算,GPU 维护最后十几个唯一顶点属性组合的元组缓存,如果该组合再次出现,则(顶点着色器的)计算结果从缓存而不是重新计算。如果使用 glDrawElements,则仅对索引类似。因此,虽然乍一看可能看起来像冗余,但它实际上节省了大量冗余。
  • 好的,首先,感谢您澄清顶点的东西(虽然我已经知道它是什么,但我只是更喜欢使用术语顶点而不是点,尽管它是错误的。)其次,如果我使用着色器,我可以为同一个模型有多个着色器吗?例如,如果我想要一个纹理模型(我猜这使用顶点着色器)以及凹凸贴图和反射率(我知道这三个都做很傻,但这是一个例子。)我只是希望这样做可以避免必须在每次调用时检查属性是否存在,并且只在特定模型上使用它们。
  • @BenjaminDangerJohnson:在每个着色器阶段,您只能安装一个着色器。顶点和片段着色器是必需的,因为 OpenGL-3 核心、几何和曲面细分是可选的。但是着色器稍后会链接到 程序,并且完全有可能、有效并建议在多个程序之间共享通用着色器。因此,您可以拥有 1 个骨架动画顶点着色器,并在多个程序中一起使用它,每个程序都使用不同的片段着色器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2014-06-26
相关资源
最近更新 更多