2010-05-01 13 views
0

Je suis en train de le port des algorithmes d'interpolation d'image en code HLSL, pour l'instant j'obtenu:HLSL, pixel shader du programme avec différents algorithmes de downscaling de Texture2D

float2 texSize; 
float scale; 
int method; 

sampler TextureSampler : register(s0); 


float4 PixelShader(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 
{ 
float2 newTexSize = texSize * scale; 
float4 tex2; 

if(texCoord[0] * texSize[0] > newTexSize[0] || 
texCoord[1] * texSize[1] > newTexSize[1]) 
{ 
tex2 = float4(0, 0, 0, 0); 

} else { 
if (method == 0) { 
     tex2 = tex2D(TextureSampler, float2(texCoord[0]/scale, texCoord[1]/scale)); 
    } else { 
     float2 step = float2(1/texSize[0], 1/texSize[1]); 

     float4 px1 = tex2D(TextureSampler, float2(texCoord[0]/scale-step[0], texCoord[1]/scale-step[1])); 
     float4 px2 = tex2D(TextureSampler, float2(texCoord[0]/scale  , texCoord[1]/scale-step[1])); 
     float4 px3 = tex2D(TextureSampler, float2(texCoord[0]/scale+step[0], texCoord[1]/scale-step[1])); 
     float4 px4 = tex2D(TextureSampler, float2(texCoord[0]/scale-step[0], texCoord[1]/scale  )); 
     float4 px5 = tex2D(TextureSampler, float2(texCoord[0]/scale+step[0], texCoord[1]/scale  )); 
     float4 px6 = tex2D(TextureSampler, float2(texCoord[0]/scale-step[0], texCoord[1]/scale+step[1])); 
     float4 px7 = tex2D(TextureSampler, float2(texCoord[0]/scale  , texCoord[1]/scale+step[1])); 
     float4 px8 = tex2D(TextureSampler, float2(texCoord[0]/scale+step[0], texCoord[1]/scale+step[1])); 
     tex2 = (px1+px2+px3+px4+px5+px6+px7+px8)/8; 
     tex2.a = 1; 

    } 
} 
return tex2; 
} 


technique Resample 
{ 
pass Pass1 
{ 
    PixelShader = compile ps_2_0 PixelShader(); 
} 
} 

Le problème est que pixel shader de programmation nécessite approche différente parce que nous n'avons pas le contrôle de la position actuelle, seulement la partie "interne" de la boucle réelle à travers les pixels.

J'ai été googling pour environ une journée entière et trouvé aucune bibliothèque open source avec des algorithmes de mise à l'échelle utilisés en boucle. Existe-t-il une bibliothèque de ce genre dans laquelle je pourrais porter des méthodes?

J'ai trouvé http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx mais je ne comprends vraiment pas son approche du problème, et le portage sera une douleur dans le ...

Wikipédia raconte une approche matematic. Donc ma question est: Où puis-je trouver la bibliothèque open source graphique facile à utiliser qui inclut des algorithmes de mise à l'échelle simples? Bien sûr, si une telle bibliothèque existe même :)

Répondre

1

Le problème est que les shaders sont un domaine fonctionnel. La plupart des algorithmes auxquels vous faites référence sont faits dans des langues régulières, donc ils ne seront pas portés très facilement.

Vous pouvez trouver des informations en regardant l'image du plus proche voisin fonctions de redimensionnement dans des choses comme Matlab ... par exemple dans cette question SO:
Nearest-neighbor interpolation algorithm in MATLAB