统一变量的内存数据流?

Posted

技术标签:

【中文标题】统一变量的内存数据流?【英文标题】:Memory data flow for uniform variables? 【发布时间】:2019-02-22 22:29:13 【问题描述】:

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

例如代码:

纹理数据

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

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

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

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

矩阵数据

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

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

在将矩阵数据作为统一输入传递给着色器的每个步骤中,矩阵数据位于何处?

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

如果上传到OpenGL:

哪个步骤/函数调用上传数据?

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

它的内存位置是如何指向的?

【问题讨论】:

GPU默认uniform块数据存储中uniform变量“life”的值。 【参考方案1】:

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

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

只是在 GLSL 中,您无法访问采样器统一变量的“值”;你可以使用纹理访问函数来代替它。

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

在将矩阵数据作为统一输入传递给着色器的每个步骤中,矩阵数据位于何处?

在将统一值传递给着色器的“过程”中只有一步。您拨打glUniform* 电话,“流程”完成;特定的制服现在具有特定的价值。

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

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

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

【讨论】:

"它存在于实现选择放置它的任何位置。但是,所有 OpenGL 函数在返回时都使用您传递的指针完成。" - 如果实现决定在客户端存储/保留数据,OpenGL 指针可以指向 CPU 内存位置吗? @user2259784:什么是“OpenGL 指针”?实现是它自己的事情。它可以有指向 CPU 内存和 GPU 内存的指针;只是不要记住拥有的记忆。

以上是关于统一变量的内存数据流?的主要内容,如果未能解决你的问题,请参考以下文章

java 6 -数组

java 6 -数组

saltstack基于pillar统一配置iptables防火墙实战

初识java中数组数组在内存中越界异常空指针异常

CUDA 统一内存工作(具体来说,cudaMallocManaged();)

K8S使用filebeat统一收集应用日志