off-screen render to texture prodotto matriciale a blocchi nns s c m x s
TRANSCRIPT
Off-Screen RENDER TO TEXTUREOff-Screen RENDER TO TEXTUREProdotto matriciale a blocchiProdotto matriciale a blocchi
n ns
s
C m x s
Prodotto matriciale a blocchiProdotto matriciale a blocchi
Partiziono le matrici A e B con sottomatrici quadrate di ugual dimensione nello specifico con
blocchi di 2x2 elementi
Memorizzo sulla memoria video i singoli sottoblocchi di 2x2 elementi in strutture rgba
blockAblockA blockBblockB
i,k k,jx =Ci,j =
blockA.rgba * blockB.rara
blockA.grab * blockB.bgbg
Prodotto matriciale a blocchiProdotto matriciale a blocchi
Prodotto matriciale del generico sottoblocco Ci,j da 2x2 elementi
calcolato con strutture rgba
blockA.rgba
blockB.rgba
i,k
k,j
blockA.rgba * blockB.rara
tex2D (Tex_Ck, gl_FragCoord) +( blockA.rgba * blockB.rara ) +( blockA.grab * blockB.bgbg )
Prodotto matriciale a blocchiProdotto matriciale a blocchi
blockAblockA blockBblockB
vec2 texCoordA = vec2( k_parz , gl_FragCoord.y );vec2 texCoordB = vec2( gl_FragCoord.x , k_parz );vec4 blockA = vec4( texture2DRect( textureA , texCoordA ) );vec4 blockB = vec4( texture2DRect( textureB , texCoordB ) );vec4 blockC = vec4( texture2DRect( Tex_Ck , gl_FragCoord) );
XX = colonne = j jYY = righe = i i
Prodotto matriciale a blocchiProdotto matriciale a blocchi
uniform sampler2DRect Tex_Ck ;uniform sampler2DRect textureA;uniform sampler2DRect textureB;uniform float k_parz;void main(void) { vec2 texCoordA = vec2( k_parz , gl_FragCoord.y ); vec2 texCoordB = vec2( gl_FragCoord.x , k_parz ); vec4 blockA = vec4( texture2DRect( textureA , texCoordA ) ); vec4 blockB = vec4( texture2DRect( textureB , texCoordB ) ); vec4 blockC = vec4( texture2DRect( Tex_Ck , gl_FragCoord) ); blockC += vec4( (blockA.rgba * blockB.rara) + (blockA.grab * blockB.bgbg) ); gl_FragColor = vec4(blockC);}
OpenGLOpenGL
Shader Multi-Pass
Prodotto matriciale a blocchiProdotto matriciale a blocchi
glFramebufferTexture2DEXTglActiveTextureglBindTexture
Off-Screen Render to Texture
Input: Red TextureOutput: Green Texture Input: Green TextureOutput: Red Texture
Tex_Ck
VersioneVersionePre-WrappataPre-Wrappata
le texture sono memorizzate per righe di pixel e i pixel in
successione sono memorizzati i canali di colore rgba.
A =
Prodotto matriciale a blocchiProdotto matriciale a blocchi
Prodotto matriciale a blocchiProdotto matriciale a blocchi
uniform sampler2DRect mat; void main(void) {
vec4 block;int mod_x = int(mod(gl_FragCoord.x, 2));int div_x = int(gl_FragCoord.x / 2);int mult_y = int(gl_FragCoord.y)* 2;float x = 0.5 + div_x;float y = 0.5 + mult_y;vec4 rg_block = texture2DRect( mat, vec2( x , y ) );vec4 ba_block = texture2DRect( mat, vec2( x , y + 1.0 ) );if (mod_x == 0) {
block.rg = rg_block.rg;block.ba = ba_block.rg;
}if (mod_x == 1) {
block.rg = rg_block.ba;block.ba = ba_block.ba;
}gl_FragColor = vec4( block );
}
OpenGLOpenGL
Pre-WrappedPre-Wrapped
ShaderSingle-Pass