在glTexImage2D中我将如何选择不同的内部格式,而不是在着色器中对其进行采样?

时间:2017-07-17 10:27:19

标签: c++ opengl graphics glsl

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

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

并在着色器中:

glFragColor = texture2D(sampler, uv).rgba

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

1 个答案:

答案 0 :(得分:3)

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

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:过滤后的纹理组件与纹理基础组件的对应关系。

相关问题