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
Opengl 是否有任何方法可以使用类似实例的操作同时设计多个不同的模型?_Opengl - Fatal编程技术网

Opengl 是否有任何方法可以使用类似实例的操作同时设计多个不同的模型?

Opengl 是否有任何方法可以使用类似实例的操作同时设计多个不同的模型?,opengl,Opengl,我正在学习现代OpenGL创建3D游戏和不同的功能 前一段时间,我试图为一个场景设置动画,在这个场景中,无数的模型以不同的动作同时绘制,当我编程时,我通常在打印任何内容之前修改着色器中的信息,例如 glUniform3f(glGetUniformLocation(shader,"pos"),0,10,0) glUniform1f(glGetUniformLocation(shader,"rX"),90) glDrawArrays(GL_TRIANGLES,

我正在学习现代OpenGL创建3D游戏和不同的功能

前一段时间,我试图为一个场景设置动画,在这个场景中,无数的模型以不同的动作同时绘制,当我编程时,我通常在打印任何内容之前修改着色器中的信息,例如

glUniform3f(glGetUniformLocation(shader,"pos"),0,10,0)
glUniform1f(glGetUniformLocation(shader,"rX"),90)
glDrawArrays(GL_TRIANGLES, 541203, 400)
在着色器中有一些函数,我通过在屏幕上定位模型来进行几何变换计算

然而,在编写代码的过程中,我发现了更改着色器中状态开销的问题,因此我更改了编程方式

现在,与我之前绘制的对象相同,我将所有计算都放在着色器中,从而减少了修改统一变量的需要,并使游戏更轻

但最近,我正在编写一个场景,整个自然都会随风移动,其中主要包括草和树叶

问题是,我不知道如何优化屏幕上打印的信息量,例如,在图像中,我可以创建一个场景,使用几簇草(忘记颜色)并设置动画

我想要一个结果,一个球员所在的空间有无数的草丛,当他在比赛中行走时,他可以在其他位置重新保护更多的草丛,但是如果他回到那一点,同样的草丛将在相同的位置

问题是,每个gram的位置都存储在着色器内部的一个变量中,当我修改它时,请记住它是一个包含1000多个值的数组,它会加重硬件的负担,并阻止良好的性能

因此,我不知道该怎么做,我想进一步优化代码并在屏幕上放置更多对象,但每次我这样做时,我不知道如何优化它,使其看起来像相同位置的相同对象。

您可以使用glMultiDrawArraysIndirect:

或glmultipaurementsindirect

为此目的


但是,上述函数要求OpenGL>=4.3。据我所知,这些功能还没有进入OpenGLES。但是,如果您对这个约束条件没有意见,这应该可以回答您的问题。

GLDraweElements具有更好的性能。不要渲染视野之外的模型。“在不同位置设计不同的模型”这是什么意思?你如何在“位置”上“设计”一个“模型”?我说的是3D模型和将其置于理想位置的变换,例如角色、动物、车辆,任何在某个点移动的模型,我所说的情况是,其中几个是同时绘制的。我猜否决票是因为答案只涵盖了问题的一部分。它没有说明如何定位这些模型。它甚至没有解释所提到的方法是如何起作用的。