在我的着色器中,我已经有一个特殊变量,它包含先前渲染屏幕的全部内容。它存储在
uniform sampler2D _GrabTexture;
它的内容应该是:
(作为旁注,我使用 Unity 的 GrabPass{} 来获取整个屏幕。另外请忽略 Unity 的 GUI)
现在如何再渲染一个 pass,使用 _GrabTexture 作为我的平面模型的纹理,所以结果与我的 _GrabTexture 完全相同?
(重点是,我可以在再渲染一遍之前对屏幕纹理应用一些效果,如模糊、锐化等,这样飞机的纹理现在就被风格化了。)
我在最后一关尝试这个。该变量在顶点和片段着色器中都声明。
uniform sampler2D _GrabTexture;
varying vec4 v_Position;
顶点着色器:
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
v_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
将每个模型顶点的屏幕坐标存储为可变的,以在片段着色器中使用。
片段着色器:
void main()
{
gl_FragColor = texture2D(_GrabTexture,vec2(v_Position));
}
现在使用存储的可变位置来访问 _GrabTexture 屏幕纹理。由于它是整个屏幕,我已经在屏幕坐标中的 v_Position 应该正确地获得正确的像素。
但结果是
如您所见,飞机的纹理“有点像”显示先前渲染的屏幕,但坐标不正确。如何修复它以使结果与第一张图像相同?