Hello,
I have some blur shader, but honestly it's hardly customizable. I'd like to have it more generic in such way that I set how many neighbours I want to get into calculations. My first attempt was to convert all of the TEXCOORDX into some array, but unfortunately it fails on compile time. What's wrong with it? (of course I have also changed pixel shader in the same way).
Vertex shader (before convertion):
cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
struct VertexInputType {
float4 position : POSITION;
float2 tex : TEXCOORD0;
};
struct PixelInputType {
float4 position : SV_POSITION;
float2 tex : TEXCOORD0;
float2 texCoord1 : TEXCOORD1;
float2 texCoord2 : TEXCOORD2;
float2 texCoord3 : TEXCOORD3;
float2 texCoord4 : TEXCOORD4;
float2 texCoord5 : TEXCOORD5;
float2 texCoord6 : TEXCOORD6;
float2 texCoord7 : TEXCOORD7;
float2 texCoord8 : TEXCOORD8;
float2 texCoord9 : TEXCOORD9;
float2 texCoord10 : TEXCOORD10;
float2 texCoord11 : TEXCOORD11;
float2 texCoord12 : TEXCOORD12;
float2 texCoord13 : TEXCOORD13;
float2 texCoord14 : TEXCOORD14;
float2 texCoord15 : TEXCOORD15;
};
PixelInputType HorizontalBlurVS( VertexInputType input ) {
PixelInputType output;
input.position.w = 1.0f;
output.position = mul( input.position, worldMatrix );
output.position = mul( output.position, viewMatrix );
output.position = mul( output.position, projectionMatrix );
output.tex = input.tex;
float texelSize = 1.0f / 640.0f;
output.texCoord1 = input.tex + float2( texelSize * -7.0f, 0.0f );
output.texCoord2 = input.tex + float2( texelSize * -6.0f, 0.0f );
output.texCoord3 = input.tex + float2( texelSize * -5.0f, 0.0f );
output.texCoord4 = input.tex + float2( texelSize * -4.0f, 0.0f );
output.texCoord5 = input.tex + float2( texelSize * -3.0f, 0.0f );
output.texCoord6 = input.tex + float2( texelSize * -2.0f, 0.0f );
output.texCoord7 = input.tex + float2( texelSize * -1.0f, 0.0f );
output.texCoord8 = input.tex + float2( 0.0f, 0.0f );
output.texCoord9 = input.tex + float2( texelSize * 1.0f, 0.0f );
output.texCoord10 = input.tex + float2( texelSize * 2.0f, 0.0f );
output.texCoord11 = input.tex + float2( texelSize * 3.0f, 0.0f );
output.texCoord12 = input.tex + float2( texelSize * 4.0f, 0.0f );
output.texCoord13 = input.tex + float2( texelSize * 5.0f, 0.0f );
output.texCoord14 = input.tex + float2( texelSize * 6.0f, 0.0f );
output.texCoord15 = input.tex + float2( texelSize * 7.0f, 0.0f );
return output;
}
Vertex shader (converted):
cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
struct VertexInputType {
float4 position : POSITION;
float2 tex : TEXCOORD0;
};
struct PixelInputType {
float4 position : SV_POSITION;
float2 tex : TEXCOORD0;
float2 texCoord[15] : TEXCOORD1;
};
PixelInputType HorizontalBlurVS( VertexInputType input ) {
PixelInputType output;
input.position.w = 1.0f;
output.position = mul( input.position, worldMatrix );
output.position = mul( output.position, viewMatrix );
output.position = mul( output.position, projectionMatrix );
output.tex = input.tex;
float texelSize = 1.0f / 640.0f;
output.texCoord[0] = input.tex + float2( texelSize * -7.0f, 0.0f );
output.texCoord[1] = input.tex + float2( texelSize * -6.0f, 0.0f );
output.texCoord[2] = input.tex + float2( texelSize * -5.0f, 0.0f );
output.texCoord[3] = input.tex + float2( texelSize * -4.0f, 0.0f );
output.texCoord[4] = input.tex + float2( texelSize * -3.0f, 0.0f );
output.texCoord[5] = input.tex + float2( texelSize * -2.0f, 0.0f );
output.texCoord[6] = input.tex + float2( texelSize * -1.0f, 0.0f );
output.texCoord[7] = input.tex + float2( 0.0f, 0.0f );
output.texCoord[8] = input.tex + float2( texelSize * 1.0f, 0.0f );
output.texCoord[9] = input.tex + float2( texelSize * 2.0f, 0.0f );
output.texCoord[10] = input.tex + float2( texelSize * 3.0f, 0.0f );
output.texCoord[11] = input.tex + float2( texelSize * 4.0f, 0.0f );
output.texCoord[12] = input.tex + float2( texelSize * 5.0f, 0.0f );
output.texCoord[13] = input.tex + float2( texelSize * 6.0f, 0.0f );
output.texCoord[14] = input.tex + float2( texelSize * 7.0f, 0.0f );
return output;
}