内存数据流是否有统一变量?

时间:2019-02-22 22:29:13

标签: opengl

当将纹理(2D)作为“统一”输入提供给着色器时,首先使用glTexImage2D()将其上载到OpenGL,然后使用glUniform1i()将其与着色器统一关联。

例如代码:

纹理数据

glTexImage2D():用于将纹理数据传输到服务器端。

glGetUniformLocation():用于访问着色器统一手柄。

glUniform1i():将纹理单元所指向的数据与着色器“统一”输入相关联。

但是当我们将矩阵(例如matrix4x4)作为“统一”输入传递给着色器时,不使用任何特定函数将其上载到OpenGL。我们只是使用glUniform ..()将数据与着色器输入相关联,在关联已存在于OpenGL内存中的纹理数据的情况下,也使用了着色器输入。

矩阵数据

glGetUniformLocation():访问着色器统一手柄

glUniformMatrix4fv():将矩阵数据与着色器统一输入关联。

在将矩阵数据作为统一输入传递到着色器的过程中,矩阵数据在每个步骤中都存放在哪里?

  • 矩阵数据是否始终存在于客户端/ CPU可访问的内存中并由服务器端获取每一帧?

  • 如果它已上传到OpenGL:

    • 哪个步骤/功能调用会上传数据?

    • 数据存放在OpenGL内存中的什么位置?

    • 如何指出其内存位置?

1 个答案:

答案 0 :(得分:1)

  

将纹理单元所指向的数据与着色器的“均匀”输入相关联。

否,这会将统一变量(uniform不是“输入”)的“值”设置为纹理单元索引,采样器可以在其中找到该统一表示的纹理。这个值只是一个值;它与设置 any 统一变量的值的方式没有什么不同。

在GLSL中,您不必访问采样器统一变量的“值”;您可以在其上使用纹理访问功能。

如果在使用着色器渲染之前更改绑定到该纹理单元的纹理,则着色器将看到新纹理。它与任何纹理都不直接相关;着色器仅与纹理单元索引关联。

  

在将矩阵数据作为统一输入传递给着色器的过程中,矩阵数据在每个步骤中都存放在哪里?

将统一值传递给着色器的“过程”只有一步。您进行glUniform*调用,“过程”完成。特定的制服现在具有特定的价值。

这与在OpenGL中几乎设置任何状态没有什么不同。如果进行glTexParameter调用,则将执行设置状态值的“过程”,并将其传递到OpenGL纹理对象中的适当位置。

  

矩阵数据是否始终存在于客户端/ CPU可访问的内存中并由服务器端获取每一帧?

它存在于实现选择放置的任何位置。但是,all OpenGL functions are finished with the pointers you pass them by the time they return。因此,您不必担心您的 CPU内存。