В моя шейдър вече имам специална променлива, която има цялото съдържание на преди това изобразен екран. Съхранява се в
uniform sampler2D _GrabTexture;
Какво трябва да бъде съдържанието му:
(Като странична бележка, използвам GrabPass{} на Unity, за да получа целия екран. Също така, моля, игнорирайте GUI на Unity)
Сега как мога да направя още едно преминаване, като използвам _GrabTexture като текстура за моя самолетен модел, така че резултатът да е абсолютно същият като моя _GrabTexture?
(Въпросът е, че мога да приложа някои ефекти като замъгляване, изостряне и т.н. към тази текстура на екрана, преди да направя още едно преминаване, така че текстурата на самолета вече да е стилизирана.)
Опитвам това във финалния пас. Променливата е декларирана както във Vertex, така и във Fragment Shader.
uniform sampler2D _GrabTexture;
varying vec4 v_Position;
Vertex Shader:
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
v_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Съхранявайте екранната координата на върха на всеки модел като варираща, за да се използва във Fragment Shader.
Шейдър на фрагменти:
void main()
{
gl_FragColor = texture2D(_GrabTexture,vec2(v_Position));
}
Сега използвайте тази съхранена променлива позиция за достъп до текстурата на екрана _GrabTexture. Тъй като това е целият екран, моята v_Position, която вече е в екранната координата, трябва правилно да получи правилния пиксел.
Но резултатът е
Както можете да видите, текстурата на самолета е "някак си", показваща преди това изобразен екран, но координатите не са правилни. Как мога да го поправя, така че резултатът да е същият като първото изображение?