当将纹理(2D)作为“统一”输入提供给着色器时,首先使用glTexImage2D()将其上载到OpenGL,然后使用glUniform1i()将其与着色器统一关联。
例如代码:
纹理数据
glTexImage2D()
:用于将纹理数据传输到服务器端。
glGetUniformLocation()
:用于访问着色器统一手柄。
glUniform1i()
:将纹理单元所指向的数据与着色器“统一”输入相关联。
但是当我们将矩阵(例如matrix4x4)作为“统一”输入传递给着色器时,不使用任何特定函数将其上载到OpenGL。我们只是使用glUniform ..()将数据与着色器输入相关联,在关联已存在于OpenGL内存中的纹理数据的情况下,也使用了着色器输入。
矩阵数据
glGetUniformLocation()
:访问着色器统一手柄
glUniformMatrix4fv()
:将矩阵数据与着色器统一输入关联。
在将矩阵数据作为统一输入传递到着色器的过程中,矩阵数据在每个步骤中都存放在哪里?
矩阵数据是否始终存在于客户端/ CPU可访问的内存中并由服务器端获取每一帧?
如果它已上传到OpenGL:
哪个步骤/功能调用会上传数据?
数据存放在OpenGL内存中的什么位置?
如何指出其内存位置?
答案 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内存。