gpt4 book ai didi

objective-c - OpenGL ES 2.0 多个网格? (只是真实世界的例子)

转载 作者:太空狗 更新时间:2023-10-30 03:38:25 26 4
gpt4 key购买 nike

我对这一点有点困惑。

我在书籍、博客、论坛甚至 OpenGl 规范中找到的所有内容都只是谈论非常抽象的技术。与真实世界的例子无关。

我对此非常着迷:如何使用 OpenGL ES 2.x 放置和管理多个对象(网格)?

理论上看起来很简单。你有一个顶点着色器(vsh)和片段着色器(fsh),然后你将两者绑定(bind)到一个程序(glGenProgram,glUseProgram,......)。在渲染的每个循环中,该程序将通过每个顶点执行其 VSH,之后将对该 3d 对象的每个“像素”执行 FSH,最后将最终结果发送到缓冲区(显然没有谈论每个顶点,光栅化,以及管道中的其他步骤)。

好吧,看起来很简单......

所有这些都是通过调用绘制函数(glDrawArrays 或 glDrawElements)触发的。

再次确定。

现在事情让我感到困惑。如果您有多个对象要渲染?

让我们来谈谈一个现实世界的例子。想象一下,你有一个有树木的景观和一个角色。风景中的草有一个纹理,树有树干和树叶的纹理(纹理图集),最后角色有另一种纹理(纹理图集)并且也是动画的。

想象完这个场景,我的问题就简单了:你是如何组织的?

您为场景中的每个元素创建了一个单独的程序(一个 VSH 和一个 FSH)?就像草地和土壤的救济计划,树木的计划和人物的计划?

我试过了,但是...当我创建多个程序并尝试使用 glVertexAttribPointer() 时,对象的纹理和颜色会相互冲突。因为第一个程序的属性、索引的位置在第二个程序中重复。

让我解释一下,我在一个控制场景地板的类中使用了 glGetAttribLocation(),因此 OpenGL 核心返回给我顶点属性的索引 0,1 和 2。之后,在树类中,我创建了另一个程序,另一个着色器,并在再次使用 glGetAttribLocation() 之后,此时 OpenGL 核心返回索引为 0、1、2 和 3。

在渲染周期之后,我开始使用 glUseProgram() 设置第一个程序,并使用 glVertexAttribPointer() 更改其顶点属性,最后调用 glDrawElements()。在此之后,再次调用 glUseProgram() 到第二个程序并再次使用 glVertexAttribPointer(),最后调用 glDrawElements()。但是此时,事情就发生了冲突,因为第二个程序的顶点属性索引也影响了第一个程序的顶点。

我尝试了很多东西,搜索了很多,问了很多...我已经筋疲力尽了。我找不到问题所在。

所以我开始认为我做错了一切!

现在我再次重复我的问题:如何在 OpenGL ES 2.x 中使用多个网格(具有不同的纹理和行为)?使用多个程序?怎么办?

最佳答案

要绘制多个网格,只需多次调用 glDrawElements/glDrawArrays。如果这些网格需要不同的着色器,只需设置它们即可。一个,并且只有一个着色器程序处于事件状态。

因此每次更改着色器程序(特别是 VS)时,都需要重置所有顶点属性和指针。

就这么简单。

关于objective-c - OpenGL ES 2.0 多个网格? (只是真实世界的例子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4017573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com