Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opengl中的顶点缓冲区_Opengl_Oop_3d_Directx - Fatal编程技术网

opengl中的顶点缓冲区

opengl中的顶点缓冲区,opengl,oop,3d,directx,Opengl,Oop,3d,Directx,我正在制作一个用于个人学习的小型3d图形游戏/演示。我知道d3d9和d3d11,但目前对opengl知之甚少,所以我打算抽象出图形的实际渲染,这样我的场景图和“上面”的所有内容就不需要知道如何实际绘制图形。我打算让它与d3d9一起工作,然后添加d3d11支持,最后是opengl支持。作为学习3d图形和抽象的学习练习 不过,目前我对opengl了解不多,也不希望我的抽象接口公开任何不容易在opengl中实现的东西。我特别关注顶点缓冲区。在d3d中,它们本质上是一个结构数组,但从opengl界面看,

我正在制作一个用于个人学习的小型3d图形游戏/演示。我知道d3d9和d3d11,但目前对opengl知之甚少,所以我打算抽象出图形的实际渲染,这样我的场景图和“上面”的所有内容就不需要知道如何实际绘制图形。我打算让它与d3d9一起工作,然后添加d3d11支持,最后是opengl支持。作为学习3d图形和抽象的学习练习

不过,目前我对opengl了解不多,也不希望我的抽象接口公开任何不容易在opengl中实现的东西。我特别关注顶点缓冲区。在d3d中,它们本质上是一个结构数组,但从opengl界面看,等价物似乎是顶点数组。但是,在需要一个单独的顶点数组、一个法线数组、一个纹理坐标数组等,并使用glVertexPointer、glTexCoordPointer等设置的情况下,这些数组的组织方式似乎有所不同

我希望能够实现一个与directx非常相似的VertexBuffer接口,但在d3d中似乎有一个结构数组,而在opengl中,每个元素都需要一个单独的数组,这使得找到一个通用的抽象非常困难


有没有任何方法可以像directx一样使用opengl?或者关于如何提出更高级别的抽象以有效地处理这两个系统的任何建议?

顶点数组具有跨步和偏移属性。这是为了特别考虑结构的数组

因此,假设要使用float3顶点和float2纹理坐标设置VBO,请执行以下操作:

// on creation of the buffer
typedef struct { GLfloat vert[3]; GLfloat texcoord[2]; } PackedVertex;
glBindBuffer(GL_ARRAY_BUFFER, vboname);
glBufferData(...); // fill vboname with array of PackedVertex data

// on using the buffer
glBindBuffer(GL_ARRAY_BUFFER, vboname);
glVertexPointer(3, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(0)));
glTexCoordPointer(2, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, texcoord));

使用BUFFER_OFFSET,一个宏将偏移量转换为相应的指针(VBO使用指针参数作为偏移量),另一个宏的偏移量在PackedVertex结构中查找texcoord的偏移量。在这里,它可能是sizeof(float)*3,因为结构内部不太可能有任何填充。

啊,好的,这是有道理的。您仍然需要调用不同的函数来设置不同的属性,但是我仍然能够与d3d共享一个结构。嗯,我真的需要学习更多关于opengl的知识:)@JB,事实上,如果你使用GL3.0,它引入了顶点数组对象,封装了整个过程。避免使用gl..指针作为瘟疫。改用GLVERTEXATTRIBPOINT。此外,如果您能帮助避免交错数据(步幅)。而是在一个缓冲区对象中顺序保存各个顶点属性。记住要通过调整数据缓冲区来使GPU满意。@Mads Elvheim:为什么?因为它们在GL3中被弃用了?我不知道GL JB使用什么。它们并不慢,而且更有表现力。但是,是的,他们不赞成。另外,wrt交错,我可以告诉你一个事实,它使渲染速度更快,在一些平台上。大多数情况下,在顶点获取上有更好的缓存行为。另外,这是最初的问题。对不起。我应该说得更清楚些。在我看来,强制逐顶点数据是特定的,某种程度上限制了使用着色器可以表达的内容。我想我会同意我的观点。此外,在一些嵌入式平台(通常是OpenGL ES)上交错顶点数据速度很快,但在桌面PC上则不是。