0

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

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

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

4

1 回答 1

0

一个简单的立方体将生成 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获得)。

于 2012-09-22T00:33:21.037 回答