我注意到当进入片段着色器
out vec4 vertexColor
时,顶点着色器中的in vec4 vertexColor
变量将被插值。我的问题是,所有带有“out”修饰符的变量都会被插值,还是只插值某种类型?我找不到相关信息。
见类型限定符(GLSL)。浮点型输出的插值取决于插值限定符,即
flat
、noperspective
或smooth
。默认为smooth
。整数类型的输出必须用限定符 flat
限定(否则会出错)并且不会被插值。
所有用户定义的片段着色器的输入被插值。 如何插值是
layout
插值限定符的问题。默认情况下,in
将使用 smooth
,但您可以指定 noperspective
(在没有透视校正的屏幕空间中插值)或 flat
。后者通过为所有片段赋予分配给原语激发顶点的变量值来执行“插值”。 FS输入的整数类型必须使用flat
,但默认仍然是smooth
,所以如果不显式指定flat
会出现编译错误。
请注意,当您询问顶点着色器输出时,答案是关于片段着色器输入。这是有原因的。
首先,片段着色器之前可以存在多个着色器阶段。赋予 FS 的值来自最后一个活动的顶点处理着色器阶段:几何着色器、曲面细分评估着色器或顶点着色器。网格着色器(一个相对较新的扩展)改变了存在的顶点处理阶段,但最后一个仍然是为片段着色器提供数据的阶段。
所以仅仅谈论“顶点着色器”是不完整的。
第二,顶点处理阶段输出的插值限定符被ignored。唯一重要的是片段着色器 inputs 上的那些。就 GLSL 版本号而言,这是一个相对较新的变化。在 GLSL 4.30 之前,最终顶点处理阶段的输出需要与相应的片段着色器输入具有相同的限定符。从 4.30 开始,它们没有,但是顶点输出限定符被忽略了;只有片段着色器输入限定符才重要。