如果您只需从顶点着色器传入插值顶点坐标,则无需执行任何特殊的数学运算。
例如,如果您正在绘制一个覆盖屏幕的简单单位正方形,您可以然后接收全屏纹理,您可以执行如下操作:
vertex shader pseudocode:
layout(position = 0) in vec3 in_vertex;
out vec3 out_vertex;
void main()
{
//Do your matrix multiplications to your in_vertex to get its final position...
out_vertex = in_vertex;
}
然后,您的顶点着色器将正确地将 in_vertex 插值到 x:0...1、y:0...1 范围内(只要您正在绘制单位正方形)并将其传递给片段着色器。然后你的片段着色器将像这样使用它:
fragment shader pseudocode:
in vec3 out_vertex;
uniform sampler2D tex;
void main()
{
gl_fragcolor = texture(tex,vec2(out_vertex.x,out_vertex.y));
}
不需要其他数学运算,只要注意 out_vertex 只在 0...1 的范围内即可。为了稍微扩展一下这个例子,想象一下我们的正方形:
(0,1)+-----------+(1,1)
| |
| |
| |
| |
| |
(0,0)+-----------+(0,1)
我们想在正中心采样这个点:
(0,1)+-----------+(1,1)
| |
| |
| * |
| |
| |
(0,0)+-----------+(0,1)
我们的顶点着色器将自动从其他 4 个位置插入该位置,并将以下 vec3 传递给片段着色器:
out_vertex = vec3(0.5,0.5,0);
然后可以用来成功采样纹理