bcr*_*ist 5 opengl glsl opengl-3
我正在编写一个批处理系统,它跟踪当前绑定的纹理以避免不必要的glBindTexture()
调用。我不确定是否需要跟踪特定批次已经使用了哪些纹理,以便如果纹理被使用两次,它将被绑定到需要它的第二个采样器的不同 TIU。
OpenGL 应用程序在同一着色器阶段为多个采样器使用相同的纹理图像单元是否可以接受?不同着色器阶段的采样器怎么样?例如:
片段着色器:
...
uniform sampler2D samp1;
uniform sampler2D samp2;
void main() { ... }
Run Code Online (Sandbox Code Playgroud)
主程序:
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id);
glUniform1i(samp1_location, 0);
glUniform1i(samp2_location, 0);
...
Run Code Online (Sandbox Code Playgroud)
我看不出有任何原因为什么这不应该起作用,但是如果着色器程序还包含这样的顶点着色器呢:
顶点着色器:
...
uniform sampler2D samp1;
void main() { ... }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,OpenGL 应该将 的两个实例samp1
视为引用相同的位置。因此,在顶点着色器和片段着色器中使用相同的纹理单元。我读过在两个不同的着色器阶段使用相同的纹理GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
会加倍计算,但这似乎与此矛盾。
在我的硬件 (HD 6870) 上的快速测试中,以下所有场景都按预期工作:
但是,我不知道这是否是我应该在所有硬件/驱动程序上预期的行为,或者是否存在性能影响。
希望这能消除您的一些困惑,我使用了旧版本的规范。为简单起见,较新的版本有两个附加阶段(曲面细分控制/评估),因此讨论稍微复杂一些。
\n\n\n纹理访问
\n\n\n着色器能够查找纹理贴图。可用于顶点、几何或片段着色器的纹理图像单元的最大数量分别是与实现相关的常量
\nGL_MAX_VERTEX_TEXTURE_IMAGE_UNITS
、GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS
和 的值GL_MAX_TEXTURE_IMAGE_UNITS
。顶点着色器、几何着色器和片段着色器组合使用的值不能超过GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
纹理图像单元的值。如果多个顶点着色器、几何着色器和片段处理阶段访问同一纹理图像单元,则每次此类访问都会单独计数GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
。
该限制是根据每个阶段使用的唯一采样器的数量而施加的。就使用确定而言,具有不同名称但引用相同纹理单元的两个采样器制服实际上是相同的。用法是指做类似的事情texture (sampler, coords)
,如果这还不是很明显的话。仅仅声明一个采样器并为其分配一个值并不会让您更接近实现定义的限制,您实际上必须使用在运行时采样器,并且如果它与同一阶段中另一个使用的采样器具有相同的值这不算数。
至于多次使用同一个纹理对象,不,这不是GL_MAX_..._IMAGE_UNITS
的全部内容。如果需要,您可以将相同的纹理绑定到所有 48 个纹理单元(GL3.3 中的最低实现要求 - 这实际上要求每个阶段至少 16 个纹理),此限制指的是您使用的不同采样器的数量(再次参见上)在着色器阶段。如果您需要使用最近邻过滤一次并使用线性或不同的环绕状态一次,您实际上可能希望将同一纹理绑定到多个纹理单元。
如果您想了解所有驱动程序/硬件的行为,请务必查阅正式的 OpenGL 规范。我为您精心挑选了相关信息,但学习如何在将来搜索重要细节对您很有帮助。自 OpenGL 1.0 以来的所有规范均可从以下网址免费获取:http ://www.opengl.org/registry/ 。
\n 归档时间: |
|
查看次数: |
3779 次 |
最近记录: |