如果我想渲染很多对象,我必须发送MVP矩阵然后立即渲染对象,所以我将有一个发送到GPU的代码 - >渲染了很多次。但是,如果我再没有错,这不是一个好习惯,因为我失去了性能,因为向GPU发送信息的成本非常昂贵。因此,获得更好性能的方法是将所有信息发送到GPU,然后渲染所有对象。
100万美元的问题是,着色器程序如何识别单个对象而不是另一个对象使用MVP矩阵?
答案 0 :(得分:1)
如果我没错,那么着色器是在GPU中运行的程序,对吗?
可能。 OpenGL的许多实现都具有软件渲染器,如果GPU上的资源受到限制,它们可以回退到这些渲染器。但通常,是的,它们是在GPU上运行的。
我们是否使用
glUniformMatrix*
将数据发送到此程序?
这是通常的方式。您还可以通过立即模式方法(如glTexCoord*()
(在传统OpenGL中)或通过缓冲区对象设置纹理坐标等。
我不知道它是否正确但是如果我将MVP矩阵发送到着色器,我想渲染的对象顶点将在调用渲染函数之前使用着色器计算的位置。
有不同类型的着色器。为每个顶点调用一次顶点着色器。每个片段调用一次片段着色器(实际绘制的每个输出屏幕空间像素大约一次)。通常,您可能希望将模型,视图和投影矩阵分别发送到顶点着色器。 (或者可能在一些组合中将一些计算提升出着色器。)然后,您将每个顶点乘以适当的矩阵(或矩阵的组合)。
除此之外还有其他类型的着色器,但这两种着色器最常见。
如果我想渲染很多对象,我必须发送MVP矩阵然后立即渲染对象,所以我将有一个发送到GPU的代码 - >渲染了很多次。但是,如果我再没有错,这不是一个好习惯,因为我失去了性能,因为向GPU发送信息的成本非常昂贵。因此,获得更好性能的方法是将所有信息发送到GPU,然后渲染所有对象。
在着色器正常工作之前,我不会过分担心性能。性能可能取决于许多不同的因素。一个是您向GPU发送数据或从GPU接收数据的频率以及您传输的数据量。另一个是你为每个着色器做了多少次传递,另一个是你的纹理,几何和其他东西的大小。
100万美元的问题是,着色器程序如何识别单个对象而不是另一个对象使用MVP矩阵?
我过去做过的方法是通过glUseProgram()
和glUniform*()
设置当前着色器程序和制服,然后上传我的几何体作为对象,并根据需要重复每个对象或根据需要设置一组对象。