It is hard to get into shader programming. Can anyone recommend me a book or site? I did search for hours and the only thing I got working was this
However, the image crops of. I guess, because the texCoords did change and thus the tex2d() can’t read the corresponding pixel anymore. How can I avoid the image crop and the weired extension on the left side? My source so far.
#if OPENGL
#define SV_POSITION POSITION
#define VS_SHADERMODEL vs_3_0
#define PS_SHADERMODEL ps_3_0
#else
#define VS_SHADERMODEL vs_4_0_level_9_1
#define PS_SHADERMODEL ps_4_0_level_9_1
#endif
Texture2D SpriteTexture;
sampler2D SpriteTextureSampler = sampler_state
{
Texture = <SpriteTexture>;
};
float4x4 projectionMatrix;
float4x4 viewMatrix;
float gameTime = 1.0;
float bendEnd = 0.5;
float minValue = 0.1;
float strength = 0.005;
struct PixelShaderOutput
{
float4 Color: COLOR0;
};
struct VertexShaderOutput
{
float4 Position : SV_POSITION;
float2 TexCoord : TEXCOORD0;
float4 Color: COLOR0;
};
VertexShaderOutput VertexShaderLogic(float4 position : SV_POSITION, float4 color : COLOR0, float2 texCoord : TEXCOORD0)
{
VertexShaderOutput output = (VertexShaderOutput)0;
output.Position = mul(position, viewMatrix);
output.Position = mul(output.Position, projectionMatrix);
output.TexCoord = texCoord;
output.Color = color;
if (output.TexCoord.y < bendEnd)
output.TexCoord.x += minValue + sin(gameTime) * strength;
return output;
}
PixelShaderOutput PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
PixelShaderOutput output = (PixelShaderOutput)0;
output.Color = tex2D(SpriteTextureSampler, input.TexCoord) * input.Color;
return output;
}
float nrand(float2 uv)
{
return frac(sin(dot(uv, float2(12.9898, 78.233))) * 43758.5453);
}
technique SpriteDrawing
{
pass P0
{
VertexShader = compile VS_SHADERMODEL VertexShaderLogic();
PixelShader = compile PS_SHADERMODEL PixelShaderFunction();
}
};