在 glTexImage2D 中我选择与在着色器中采样不同的内部格式时会怎样?

Posted

技术标签:

【中文标题】在 glTexImage2D 中我选择与在着色器中采样不同的内部格式时会怎样?【英文标题】:How will it be when in glTexImage2D I choose different internal format from how I sample it in shader? 【发布时间】:2017-07-17 10:27:19 【问题描述】:

例如,我在代码中这样写:

glTexImage2D(GL_TEXTURE_2D, i, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

在着色器中:

glFragColor = texture2D(sampler, uv).rgba

会发生什么,这种情况有官方定义吗?

【问题讨论】:

无论如何,设备驱动程序都会将格式转换为内部格式。这就是为什么最好使用与 internal 相同的格式,所以它不需要转换任何东西。 【参考方案1】:

结果将是相同的,就像您执行以下操作一样:

glFragColor = vec4( texture2D(sampler, uv).rgb, 1.0 );

因为 Khronos 集团的Image Format 规范说:

图像格式不必存储每个组件。当着色器对此类纹理进行采样时,它仍将解析为 4 值 RGBA 向量。未按图像格式存储的组件将自动填充。如果 R、G 或 B 缺失,则使用零,而 缺失的 Alpha 始终解析为 1

进一步看OpenGL 4.6 API Core Profile Specification; 15.2. SHADER EXECUTION; page 487]:

当在片段着色器中执行纹理查找时,GL 计算过滤后的纹理值...并将其转换为纹理基色 Cb,如表 15.1 所示,...

Texture Base Texture base color Internal Format    Cb              Ab
RED                                                (Rt, 0, 0)      1
RG                                                 (Rt, Gt, 0)     1
RGB                                                (Rt, Gt, Bt)    1
RGBA                                               (Rt, Gt, Bt)    At

表 15.1:过滤后的纹理组件与纹理基础组件的对应关系。

【讨论】:

以上是关于在 glTexImage2D 中我选择与在着色器中采样不同的内部格式时会怎样?的主要内容,如果未能解决你的问题,请参考以下文章

在 glTexImage2D() 中指定 GL_RGBA32F 时输出奇怪

有选择地绘制到着色器中的某些输出

统一变量的内存数据流?

在顶点和片段着色器中访问同名统一失败

LWJGL 无法在着色器中采样帧缓冲纹理

在顶点着色器中定位顶点后如何更新法线?