budnhead/org.niclasundharald.engine/graphics/GlobalDefaults.cs

125 lines
2.5 KiB
C#

using System;
using OpenTK.Graphics.OpenGL;
namespace org.niclasundharald.engine.graphics
{
public class GlobalDefaults
{
private static GlobalDefaults _instance = new GlobalDefaults();
public static GlobalDefaults instance(){
return _instance;
}
private Shader defVertexShader,
defFragmentShader;
private ShaderProgram
defShaderProgram;
private GLSceneOrientation activeScene;
private GlobalDefaults(){
Console.WriteLine("GlobalDefaults: Shader Version: {0}", GL.GetString(StringName.ShadingLanguageVersion));
defVertexShader = new Shader(OpenTK.Graphics.OpenGL.ShaderType.VertexShader, defVertexShaderSource);
defFragmentShader = new Shader(OpenTK.Graphics.OpenGL.ShaderType.FragmentShader, defFragmentShaderSource);
defShaderProgram = new ShaderProgram(defVertexShader, defFragmentShader);
activeScene = new GLSceneOrientation();
}
public ShaderProgram DefaultShaderProgram {
get { return this.defShaderProgram;}
}
public Shader DefaultVertexShader
{
get { return defVertexShader; }
}
public Shader DefaultFragmentShader
{
get { return defFragmentShader; }
}
public GLSceneOrientation ActiveScene {
get { return this.activeScene; }
set { this.activeScene = value; }
}
private string defVertexShaderSource = @"#version 330
in vec3 iv_position;
in vec4 iv_color;
in vec3 iv_normal;
in vec2 iv_uv;
uniform mat4 mObject;
uniform mat4 mCamera;
uniform mat4 mObjectCamera;
uniform mat4 mObjectCameraIT;
uniform mat4 mProjection;
uniform mat4 mScene;
out vec4 color;
out vec3 norm;
out vec2 uv;
out vec3 coord;
out float shading;
void main()
{
gl_Position = mScene * vec4( iv_position, 1 );
float fading = 1.0;
norm = normalize( ( mObjectCameraIT * vec4( iv_normal , 1 ) ).xyz );
vec3 camray = (mObjectCamera * vec4( iv_position , 1 )).xyz;
vec3 ncamray = normalize( camray );
float cosTheta = abs( clamp(dot( norm , ncamray ), -1, 1) );
float distance = length(camray);
float idist = 25000 / distance;
float sight = clamp( idist * idist * idist, 0.1, 1.0);
shading = clamp(0.3 + (cosTheta * 0.7), 0.1, 0.9) * sight;
color = clamp( vec4( iv_color.xyz, fading ), 0, 1);
coord = camray;
}
";
private string defFragmentShaderSource = @"#version 330
in vec4 color;
in vec3 norm;
in vec2 uv;
in vec3 coord;
in float shading;
out vec4 _color;
void main()
{
float cosTheta = dot( -coord, norm );
if (cosTheta >= 0){
discard;
};
_color = vec4( color.xyz * shading, color.w );
//_color = vec4( (vec3( 1,1,1 ) + norm)/2 , 1 );
}
";
}
}