I am trying to optimize my vertex and pixel shader code. Do you have any suggestions what could I possibly do to improve performance? I am using it to draw textured cuboids, and if there are many objects in the screen my framerate drops.
VERTEX SHADER
float4x4 WorldViewProj : register(c0);
float4x3 WorldInversedMatrix : register(c4);
float4x4 World : register(c7);
float3 viewPosition : register (c11);
float3 dirLightDir : register(c12);
float xCoordMultiplication : register (c13);
float yCoordMultiplication : register (c14);
struct VsInput
{
float4 position : POSITION;
float3 normal : NORMAL;
float2 texCoord : TEXCOORD;
};
struct VsOutput
{
float4 position : POSITION;
float3 dirLightPosition : COLOR;
float2 texCoord : TEXCOORD0;
float3 normal : TEXCOORD1;
float3 view : TEXCOORD2;
};
VsOutput main(VsInput IN)
{
VsOutput OUT;
OUT.position = mul(IN.position, WorldViewProj);
//if X/YCoordMultiplication != 1, then texture is multiplicated (for example when drawing tiled floor, and my texture is single tile
OUT.texCoord = float2(IN.texCoord.x * xCoordMultiplication,
IN.texCoord.y * yCoordMultiplication);
OUT.normal = mul(WorldInversedMatrix, IN.normal);
float3 worldPosition = mul(IN.position, World).xyz;
OUT.view = viewPosition - worldPosition;
OUT.dirLightPosition = mul(dirLightDir, World);
return OUT;
}
PIXEL SHADER
float4 filterColor : register (c1);
float3 specularLightIntensity : register (c2);
texture texTexture;
sampler textureSampler : register(s0) = sampler_state {
Texture = (texTexture);
Filter = MIN_MAG_MIP_POINT;
AddressU = Wrap;
AddressV = Wrap;
};
struct VsOutput
{
float4 position : POSITION;
float3 dirLightPosition : COLOR;
float2 texCoord : TEXCOORD0;
float3 normal : TEXCOORD1;
float3 view : TEXCOORD2;
};
float4 main(VsOutput IN) : COLOR
{
float4 texColor = tex2D(textureSampler, IN.texCoord);
float3 specular = specularLightIntensity;
float materialPower = 9.0f;
float3 light = normalize(IN.dirLightPosition);
float3 view = normalize(IN.view);
float3 normal = normalize(IN.normal);
float3 halfway = normalize(light + view);
float3 processedSpecular = pow(saturate(dot(normal, halfway)), materialPower)
* specular;
float alphaChannel = texColor.a + filterColor.a;
float4 color = 1.2f * (texColor + filterColor.a * filterColor + float4(processedSpecular, 0.0f));
return float4(color.r, color.g, color.b, filterColor.a + texColor.a);
}