簡體   English   中英

opengl中紋理單元和采樣器制服的對應關系

[英]Correspondance between texture units and sampler uniforms in opengl

glActiveTexture使用的采樣器制服和紋理單元之間的對應關系顯然無法用 opengl 查詢,而且我找不到關於如何找到哪個紋理單元映射到哪個采樣器制服的好的文檔。 這是我能夠找到的:

  • 如果程序中只有采樣器uniform,則映射到gl_TEXTURE0
  • 如果在單個程序階段中有多個采樣器制服,則它們將按照它們在着色器中聲明的順序進行映射。
  • 如果頂點着色器和片段着色器具有不相交的采樣器統一集,則頂點着色器中的采樣器首先出現,然后是片段着色器中的采樣器。
  • 這種行為似乎是由規范定義的。

例如,如果頂點着色器定義:

uniform sampler2D color;

片段着色器定義:

uniform sampler2D tex;
uniform sampler2D norm;

然后color被映射到gl_TEXTURE0tex被映射到gl_TEXTURE1norm被映射到gl_TEXTURE2 但是如果頂點着色器定義為:

uniform sampler2D norm;

然后不清楚如何映射不同的紋理。 由於具有布局限定符或單獨的着色器階段的可能性,這也變得更加復雜。

我似乎無法在任何地方找到有關此的文檔。 我所知道的一切要么來自我自己的實驗,要么來自 Stackoverflow 或 OpenGL 論壇上的答案。 有沒有人知道在所有可能的情況下如何工作的一套全面規則,或者查詢采樣器對應的紋理單元的方法?

這是我能夠找到的:

  • 如果程序中只有采樣器uniform,則映射到gl_TEXTURE0
  • 如果在單個程序階段中有多個采樣器制服,則它們將按照它們在着色器中聲明的順序進行映射。
  • 如果頂點着色器和片段着色器具有不相交的采樣器統一集,則頂點着色器中的采樣器首先出現,然后是片段着色器中的采樣器。
  • 這種行為似乎是由規范定義的。

這一切都不是真的。 好吧,第一個是真的,但只是偶然。

所有未在着色器中初始化的統一值都被初始化為值 0。規范對此非常清楚:

任何沒有綁定限定符聲明的統一采樣器或圖像變量最初都綁定到零單元。

采樣器統一的值是它代表的紋理單元的整數索引。 所以 0 值對應於GL_TEXTURE0 所有未初始化的采樣器制服的值都應為 0。

如果您描述的行為正在發生,則該實現違反了 OpenGL 規范。

除非您使用layout(binding = )語法來分配統一的紋理單元,否則您必須在 OpenGL 代碼中手動為每個采樣器統一分配一個紋理單元的值。 這是通過設置它的統一值來完成的,就像任何其他整數統一:你調用glUniform1i與對應於該統一的位置。 因此,如果您想將它與紋理圖像單元索引 4 相關聯,您可以調用glUniform1i(..., 4) ,其中...是該制服的統一位置。

您必須將紋理單元的索引設置為采樣器統一(類似於設置int類型的統一變量的值)。 例如GL_TEXTURE1值為 1 。

請參閱OpenGL 4.6 API 兼容性配置文件規范; 7.10 取樣器; 第 154 頁

采樣器是 OpenGL 着色語言中使用的特殊統一體,用於標識用於每個紋理查找的紋理對象。 采樣器的值表示正在訪問的紋理圖像單元。 將采樣器的值設置為i選擇紋理圖像單元編號i

例如

layout (location = 11) uniform sampler2D color;
layout (location = 12) uniform sampler2D tex;
layout (location = 13) uniform sampler2D norm;
glUniform1i(11, 0); // 0: GL_TEXTURE0
glUniform1i(12, 1); // 1: GL_TEXTURE1
glUniform1i(13, 2); // 2: GL_TEXTURE2

從 GLSL 4.2 版開始,這可以通過指定綁定點在片段着色器中完成 - 請參閱OpenGL Shading Language 4.20 Specification - 4.4.4 Opaque-Uniform Layout Qualifiers; 第 60 頁

#version 420

layout (binding = 0) uniform sampler2D color;
layout (binding = 1) uniform sampler2D tex;
layout (binding = 2) uniform sampler2D norm;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM