关于opengl中着色器和转换的问题

时间:2014-02-27 17:36:59

标签: opengl glsl shader transformation

  • 如果我没错,那么着色器是用GPU运行的程序,对吧?
  • 我们是否使用glUniformMatrix *?
  • 将数据发送到此程序
  • 我不知道它是否正确但是如果我将MVP矩阵发送到着色器,我想渲染的对象顶点将在调用渲染函数之前使用着色器计算的位置。
  • 如果我想渲染很多对象,我必须发送MVP矩阵然后立即渲染对象,所以我将有一个发送到GPU的代码 - >渲染了很多次。但是,如果我再没有错,这不是一个好习惯,因为我失去了性能,因为向GPU发送信息的成本非常昂贵。因此,获得更好性能的方法是将所有信息发送到GPU,然后渲染所有对象。

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

1 个答案:

答案 0 :(得分:1)

  

如果我没错,那么着色器是在GPU中运行的程序,对吗?

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

  

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

这是通常的方式。您还可以通过立即模式方法(如glTexCoord*()(在传统OpenGL中)或通过缓冲区对象设置纹理坐标等。

  

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

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

除此之外还有其他类型的着色器,但这两种着色器最常见。

  

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

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

  

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

我过去做过的方法是通过glUseProgram()glUniform*()设置当前着色器程序和制服,然后上传我的几何体作为对象,并根据需要重复每个对象或根据需要设置一组对象。