2010-05-01 2 views
0

Я пытаюсь перенести некоторые алгоритмы интерполяции изображения в HLSL код, пока я получил:HLSL, программа пиксельных шейдеров с алгоритмами спустившихся разные 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(); 
} 
} 

Проблема заключается в том, что программирование пиксельных шейдеров требует другого подхода, поскольку мы не контролируем текущую позицию, а только «внутреннюю» часть фактического цикла через пиксели.

Я работаю в течение всего дня и не нашел ни одной библиотеки с открытым исходным кодом с алгоритмами масштабирования, используемыми в цикле. Есть ли такая библиотека, из которой я мог бы переносить некоторые методы?

Я нашел http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx, но я действительно не понимаю, что его подход к проблеме, и переносить его будет боль в ...

Википедия рассказывает matematic подход. Поэтому мой вопрос: где я могу найти легкую для порта графическую библиотеку с открытым исходным кодом, которая включает простые алгоритмы масштабирования? Конечно, если такая библиотека даже существует :)

ответ

1

Проблема в том, что шейдеры являются функциональным доменом. Большинство алгоритмов, о которых вы говорите, выполняются на обычных языках, поэтому они не будут переноситься очень легко.

Вы можете найти большую информацию, глядя на ближайшего соседа изменения размера изображения функции в таких вещах, как MATLAB ... например, в этом так вопрос:
Nearest-neighbor interpolation algorithm in MATLAB

Смежные вопросы