例如,我用代码编写以下内容:
glTexImage2D(GL_TEXTURE_2D, i, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
在着色器中:
glFragColor = texture2D(sampler, uv).rgba
会发生什么,这种情况有官方定义吗?
结果将是相同的,就像您将执行以下操作一样:
glFragColor = vec4( texture2D(sampler, uv).rgb, 1.0 );
因为Khronos集团的图像格式规范说:
图像格式不必存储每个组件。当着色器对此类纹理进行采样时,它仍将解析为 4 值 RGBA 矢量。未按图像格式存储的组件将自动填充。如果缺少 R、G 或 B,则使用零,而缺少的 Alpha 始终解析为 1。
进一步参见 OpenGL 4.6 API 核心配置文件规范;15.2. 着色器执行;第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:过滤后的纹理组件与纹理基础组件的对应关系。