2015-10-22 24 views
1

在應用透視變換之前,我需要在着色器中顛倒我的紋理。我修改了vertTexCoord in vert.glsl,但我不知道在哪裏使用swap.glsl。這樣做的方式就像如何在GLSL着色器中翻轉Y軸之前gl_FragColor = texture2D(*,*);

gl_FragColor = texture2D(texture, vertTexCoord); 

不起作用,因爲我也需要紋理進行透視修改。

vert.glsl:

#define PROCESSING_COLOR_SHADER 

uniform mat4 transform; 
uniform mat4 texMatrix; 

attribute vec4 vertex; 
attribute vec4 color; 
attribute vec2 texCoord; 

varying vec4 vertColor; 
varying vec4 vertTexCoord; 

void main() { 
    gl_Position = transform * vertex; 

    vertColor = color; 
    vertTexCoord = texMatrix * vec4(texCoord, 1.0, 1.0); 
} 

swap.glsl:

#ifdef GL_ES 
precision highp float; 
#endif 

// General parameters 
uniform sampler2D from; 
uniform sampler2D to; 
uniform float progress; 
uniform vec2 resolution; 

uniform float reflection; 
uniform float perspective; 
uniform float depth; 

varying vec4 vertColor; 
varying vec4 vertTexCoord; 

const vec4 black = vec4(0.0, 0.0, 0.0, 1.0); 
const vec2 boundMin = vec2(0.0, 0.0); 
const vec2 boundMax = vec2(1.0, 1.0); 

bool inBounds (vec2 p) { 
    return all(lessThan(boundMin, p)) && all(lessThan(p, boundMax)); 
} 

vec2 project (vec2 p) { 
    return p * vec2(1.0, -1.2) + vec2(0.0, -0.02); 
} 

vec4 bgColor (vec2 p, vec2 pfr, vec2 pto) { 
    vec4 c = black; 
    pfr = project(pfr); 
    if (inBounds(pfr)) { 
    c += mix(black, texture2D(from, pfr), reflection * mix(1.0, 0.0, pfr.y)); 
    } 
    pto = project(pto); 
    if (inBounds(pto)) { 
    c += mix(black, texture2D(to, pto), reflection * mix(1.0, 0.0, pto.y)); 
    } 
    return c; 
} 

void main() { 
    vec2 p = gl_FragCoord.xy/resolution.xy; 
    vec2 pfr, pto = vec2(-1.); 

    float size = mix(1.0, depth, progress); 
    float persp = perspective * progress; 
    pfr = (p + vec2(-0.0, -0.5)) * vec2(size/(1.0-perspective*progress), size/(1.0-size*persp*p.x)) + vec2(0.0, 0.5); 

    size = mix(1.0, depth, 1.-progress); 
    persp = perspective * (1.-progress); 
    pto = (p + vec2(-1.0, -0.5)) * vec2(size/(1.0-perspective*(1.0-progress)), size/(1.0-size*persp*(0.5-p.x))) + vec2(1.0, 0.5); 

    bool fromOver = progress < 0.5; 

    if (fromOver) { 
    if (inBounds(pfr)) { 
     gl_FragColor = texture2D(from, pfr); 
    } 
    else if (inBounds(pto)) { 
     gl_FragColor = texture2D(to, pto); 
    } 
    else { 
     gl_FragColor = bgColor(p, pfr, pto); 
    } 
    } 
    else { 
    if (inBounds(pto)) { 
     gl_FragColor = texture2D(to, pto); 
    } 
    else if (inBounds(pfr)) { 
     gl_FragColor = texture2D(from, pfr); 
    } 
    else { 
     gl_FragColor = bgColor(p, pfr, pto); 
    } 
    } 
} 
+0

是什麼texMatrix辦? – GraphicsMuncher

+0

「頂點着色器中有一個名爲** texMatrix **的新統一體,它重新調整每個頂點的紋理座標(在附加屬性texCoord中傳遞),以考慮沿着Y軸的紋理反轉(如Processing的垂直軸與OpenGL的相反)「,如https://processing.org/tutorials/pshader/ –

回答

4

您在

(u,v) 

如果你想翻轉Y軸採樣質感,只是樣本at

(u, 1.0f -v) 

所以,你的更新main看起來像:

void main() { 
    gl_Position = transform * vertex; 

    vertColor = color; 
    newTCoord = texCoord; 
    newTCoord.y = 1.0 - newTCoord.y; 
    vertTexCoord = vec4(newTCoord, 1.0, 1.0); 
} 
+0

所寫。我的vertTexCoord已經在texMatrix(可能與Processing)的幫助下翻轉過來了。問題是如何在swap.glsl –

+0

的透視變換之前或之後將其應用於gl_FragColor gl_Position是OpenGL用來確定插值和繪製哪些像素的內容。像vertexTexCoord這樣的頂點屬性也是內插的。我不知道你爲什麼要將透視變換應用到你的紋理座標。 – GraphicsMuncher

+0

我想這是不明確的。 Swap.glsl會像這樣進行照片轉換:http://transitions.glsl.io/transition/2a3f2e907e1c0a152e60 問題是我的照片是顛倒的。我無法修改gl_FragColor,因爲它被這些轉換使用。我需要一種在轉換修改之前翻轉紋理的方法。 –