统一变量的内存数据流?
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】:将纹理单元指向的数据与着色器“统一”输入相关联。
不,这将统一变量的“值”(uniform
s 不是“输入”)设置为纹理单元索引,采样器可以在其中找到该统一代表的纹理。价值只是一个价值;它与您设置 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 内存的指针;只是不要记住你拥有的记忆。以上是关于统一变量的内存数据流?的主要内容,如果未能解决你的问题,请参考以下文章
saltstack基于pillar统一配置iptables防火墙实战