2017-04-25 22:01:18 +02:00
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
using OpenTK.Graphics.OpenGL;
|
|
|
|
|
|
2017-05-01 01:33:33 +02:00
|
|
|
|
namespace org.niclasundharald.engine.graphics
|
2017-04-25 22:01:18 +02:00
|
|
|
|
{
|
|
|
|
|
public class GlobalDefaults
|
|
|
|
|
{
|
|
|
|
|
private static GlobalDefaults _instance = new GlobalDefaults();
|
|
|
|
|
public static GlobalDefaults instance(){
|
|
|
|
|
return _instance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Shader defVertexShader,
|
|
|
|
|
defFragmentShader;
|
|
|
|
|
private ShaderProgram
|
|
|
|
|
defShaderProgram;
|
|
|
|
|
|
2017-04-28 11:51:02 +02:00
|
|
|
|
private GLSceneOrientation activeScene;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
2017-04-28 11:51:02 +02:00
|
|
|
|
activeScene = new GLSceneOrientation();
|
2017-04-25 22:01:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ShaderProgram DefaultShaderProgram {
|
|
|
|
|
get { return this.defShaderProgram;}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Shader DefaultVertexShader
|
|
|
|
|
{
|
|
|
|
|
get { return defVertexShader; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Shader DefaultFragmentShader
|
|
|
|
|
{
|
|
|
|
|
get { return defFragmentShader; }
|
|
|
|
|
}
|
|
|
|
|
|
2017-04-28 11:51:02 +02:00
|
|
|
|
public GLSceneOrientation ActiveScene {
|
|
|
|
|
get { return this.activeScene; }
|
|
|
|
|
set { this.activeScene = value; }
|
2017-04-25 22:01:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private string defVertexShaderSource = @"#version 330
|
|
|
|
|
|
2017-05-08 14:30:41 +02:00
|
|
|
|
layout(location = 0) in vec3 iv_position;
|
|
|
|
|
layout(location = 1) in vec4 iv_color;
|
|
|
|
|
layout(location = 2) in vec3 iv_normal;
|
|
|
|
|
layout(location = 3) in vec4 iv_col2;
|
|
|
|
|
layout(location = 4) in vec2 iv_uv;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
|
2017-04-28 11:51:02 +02:00
|
|
|
|
uniform mat4 mObject;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
uniform mat4 mCamera;
|
2017-04-28 11:51:02 +02:00
|
|
|
|
uniform mat4 mObjectCamera;
|
|
|
|
|
uniform mat4 mObjectCameraIT;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
uniform mat4 mProjection;
|
2017-04-28 11:51:02 +02:00
|
|
|
|
uniform mat4 mScene;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
|
|
|
|
|
out vec4 color;
|
|
|
|
|
out vec3 norm;
|
|
|
|
|
out vec2 uv;
|
2017-05-01 11:26:05 +02:00
|
|
|
|
out vec3 coord;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
|
2017-05-01 01:33:33 +02:00
|
|
|
|
out float shading;
|
|
|
|
|
|
2017-04-25 22:01:18 +02:00
|
|
|
|
void main()
|
|
|
|
|
{
|
2017-04-28 11:51:02 +02:00
|
|
|
|
gl_Position = mScene * vec4( iv_position, 1 );
|
2017-04-25 22:01:18 +02:00
|
|
|
|
|
2017-05-01 01:33:33 +02:00
|
|
|
|
float fading = 1.0;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
|
2017-05-01 01:33:33 +02:00
|
|
|
|
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);
|
|
|
|
|
|
2017-05-01 12:36:11 +02:00
|
|
|
|
shading = clamp(0.3 + (cosTheta * 0.7), 0.1, 0.9) * sight;
|
2017-05-08 14:30:41 +02:00
|
|
|
|
color = clamp( vec4( iv_color.xyz, fading ) * iv_col2, 0, 1);
|
2017-05-01 11:26:05 +02:00
|
|
|
|
coord = camray;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
private string defFragmentShaderSource = @"#version 330
|
|
|
|
|
|
|
|
|
|
in vec4 color;
|
|
|
|
|
in vec3 norm;
|
|
|
|
|
in vec2 uv;
|
2017-05-01 11:26:05 +02:00
|
|
|
|
in vec3 coord;
|
2017-04-25 22:01:18 +02:00
|
|
|
|
|
2017-05-01 01:33:33 +02:00
|
|
|
|
in float shading;
|
|
|
|
|
|
2017-04-25 22:01:18 +02:00
|
|
|
|
out vec4 _color;
|
|
|
|
|
|
|
|
|
|
void main()
|
|
|
|
|
{
|
2017-05-01 11:26:05 +02:00
|
|
|
|
float cosTheta = dot( -coord, norm );
|
|
|
|
|
|
|
|
|
|
if (cosTheta >= 0){
|
|
|
|
|
discard;
|
|
|
|
|
};
|
|
|
|
|
|
2017-05-01 12:36:11 +02:00
|
|
|
|
_color = vec4( color.xyz * shading, color.w );
|
|
|
|
|
//_color = vec4( (vec3( 1,1,1 ) + norm)/2 , 1 );
|
2017-04-25 22:01:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|