2014-02-27 56 views
0
  • 如果我没有错,着色器是运行在GPU中的程序,对吧?
  • 我们是否将数据发送到使用glUniformMatrix *这个节目?
  • 我不知道它是否正确,但如果我向着色器发送MVP矩阵,则要调用渲染函数之前,要渲染的对象的顶点将使用由着色器计算的位置。
  • 如果我想渲染很多对象,我必须发送MVP矩阵,然后在渲染对象之后,所以我将有一个代码发送给GPU - >渲染很多次。但是,如果我没有再次错误,这不是一个好的做法,因为我失去了性能,因为向GPU发送信息的代价非常昂贵。因此,获得更好性能的一种方式是将所有信息发送给GPU,然后渲染所有对象。问题abour着色器和opengl转换

  • 而100万美元的问题是,着色器程序如何识别MVP矩阵是由单个对象使用而不是另一个对象?

+0

发送矩阵到GPU很便宜。不便宜的是转换CPU上的顶点,然后将其上传到GPU或更糟糕的是不断加载新的纹理数据。这些是你应该关注的最小化的事情,如果你想尽量减少统一数据传输的开销,你应该考虑'统一缓冲区对象'。如果使用正确,您可以在多个GLSL程序之间共享相同的矩阵,并且可以在与UBO的单个呼叫中上传多个统一变量。 –

+0

@ AndonM.Coleman,我正在计算cpu上的MVP,因为我正在进行分层转换,我的问题是我需要渲染由30个对象(如球体和圆柱体)组成的64个手模型。 – Guto

+0

听起来像骨骼动画非常多。常用的方法是使用统一的缓冲区对象。许多人开始使用一系列矩阵制服来发现他们耗尽统一存储空间的速度很快。 UBO还克服了每级1024个浮点统一组件的缺省实现特定限制(每个'mat4'需要16个浮点组件)。由于统一存储空间在常量和其他制服之间共享,因此如果不使用UBO,则可能会快速耗尽空间。 –

回答

1

如果我没有错,着色器是在GPU上运行的程序,对不对?

可能。 OpenGL的许多实现都有软件渲染器,如果GPU上的资源受到限制,它们可以回退。但通常,是的,它们在GPU上运行。

我们是否使用glUniformMatrix*将数据发送至该程序?

这是通常的方法。您还可以设置之类的东西纹理通过直接模式的方法,如glTexCoord*()(在传统的OpenGL)坐标或者,或者通过缓冲对象。

我不知道它是否正确,但如果我向着色器发送MVP矩阵,我想要渲染的对象的顶点将在调用渲染函数之前使用由着色器计算的位置。

有不同类型的着色器。顶点着色器每个顶点被调用一次。每个片段调用一次片段着色器(每个输出的屏幕空间像素大约一次实际绘制)。通常,您可能希望将模型,视图和投影矩阵分别发送到顶点着色器。 (或者可能在一些组合升降机一些计算出来的着色器)。然后,你会乘以(矩阵或组合)的合适的基体的每个顶点。

还有其他类型的超出着色器,但那些2是最常见的。

如果我想渲染大量的对象,我必须之后发送MVP矩阵然后渲染对象,所以我将有发送给GPU代码 - >渲染了很多次。但是,如果我没有猜错了,这是不是因为我失去的性能,因为将信息发送给GPU的成本是非常昂贵的一个很好的做法。因此,获得更好性能的一种方式是将所有信息发送给GPU,然后渲染所有对象。

我不会过度担心性能,直到着色器正常工作。性能可能取决于许多不同的因素。一种是您多长时间向GPU发送数据或从GPU接收数据,以及您传输的数据量。另一个是你为每个着色器做了多少遍,另一个是你的纹理,几何和其他东西的大小。

而100万美元的问题是,着色器程序如何识别MVP矩阵是由单个对象使用而不是另一个对象?

我已经做了,在过去是通过glUseProgram()glUniform*()设置当前着色器程序和制服,然后上传我的几何对象,并为每个对象必要时重复或对象集结合的方式需要。