Объркване на координатите модел-екран в шейдъра GLSL

В моя шейдър вече имам специална променлива, която има цялото съдържание на преди това изобразен екран. Съхранява се в

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, която вече е в екранната координата, трябва правилно да получи правилния пиксел.

Но резултатът е

въведете описание на изображението тук

Както можете да видите, текстурата на самолета е "някак си", показваща преди това изобразен екран, но координатите не са правилни. Как мога да го поправя, така че резултатът да е същият като първото изображение?


person 5argon    schedule 23.11.2012    source източник


Отговори (1)


Мислите твърде сложно. OpenGL ви казва позицията на фрагмента на екрана във фрагментния шейдър, вграден в променлива gl_FragCoord.

С GLSL-1.30 или по-нов имате texelFetch, на който можете да дадете gl_FragCoord директно като координата на източника. Или използвате translate gl_FragCoord в координати на пространството на текстурата, вижте https://stackoverflow.com/a/5879551/524368

person datenwolf    schedule 23.11.2012
comment
Благодаря! Вашето преобразуване върши работа, защото нямам поддръжка за texelFetch в GLSL на Unity. (Аз също познавам gl_FragCoord, но се чудех как ми се е изплъзнало) Но недостатъкът е, че не мога да знам ширината и височината на sampler2D по време на изпълнение в кода на шейдъра, така че трябва да го настроя според моя екран. - person 5argon; 24.11.2012
comment
@Sargon: Използвайте униформа, за да прехвърлите размера на текстурата като допълнителен vec2. - person datenwolf; 24.11.2012