2
// This unit is part of the GLScene Engine https://github.com/glscene
5
Ivory shader simulate Ivory material.
6
At this time only one light source is supported
9
08/12/15 - J.Delauney - Creation
22
GLScene, GLCrossPlatform, GLBaseClasses, GLState, OpenGLTokens, OpenGL1x, GLContext, GLRenderContextInfo,
23
GLVectorGeometry, GLCoordinates,
24
GLTextureFormat,GLColor, GLTexture, GLMaterial,
25
GLSLShader, GLCustomShader;
27
//TGLCustomGLSLIvoryShader
29
{ Custom class for GLSLIvoryShader.
30
A shader that simulate Ivory Material }
32
TGLCustomGLSLIvoryShader = class(TGLCustomGLSLShader)
36
procedure DoApply(var rci : TGLRenderContextInfo; Sender : TObject); override;
37
function DoUnApply(var rci: TGLRenderContextInfo): Boolean; override;
39
constructor Create(AOwner : TComponent); override;
40
destructor Destroy; override;
45
TGLSLIvoryShader = class(TGLCustomGLSLIvoryShader)
52
{ TGLCustomGLSLIvoryShader }
54
constructor TGLCustomGLSLIvoryShader.Create(AOwner: TComponent);
58
with VertexProgram.Code do
61
Add('varying vec3 normal; ');
62
Add('varying vec3 lightVec; ');
63
Add('varying vec3 viewVec; ');
67
Add(' gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; ');
68
Add(' vec4 lightPos = gl_LightSource[0].position;');
69
Add(' vec4 vert = gl_ModelViewMatrix * gl_Vertex; ');
70
Add(' normal = gl_NormalMatrix * gl_Normal; ');
71
Add(' lightVec = vec3(lightPos - vert); ');
72
Add(' viewVec = -vec3(vert); ');
76
with FragmentProgram.Code do
79
Add('varying vec3 normal; ');
80
Add('varying vec3 lightVec; ');
81
Add('varying vec3 viewVec; ');
85
Add('vec3 norm = normalize(normal); ');
86
Add('vec3 L = normalize(lightVec); ');
87
Add('vec3 V = normalize(viewVec); ');
88
Add('vec3 halfAngle = normalize(L + V); ');
89
Add('float NdotL = dot(L, norm); ');
90
Add('float NdotH = clamp(dot(halfAngle, norm), 0.0, 1.0); ');
91
Add('// "Half-Lambert" technique for more pleasing diffuse term ');
92
Add('float diffuse = 0.5 * NdotL + 0.5; ');
93
Add('float specular = pow(NdotH, 64.0); ');
94
Add('float result = diffuse + specular; ');
95
Add('gl_FragColor = vec4(result); ');
104
destructor TGLCustomGLSLIvoryShader.Destroy;
110
procedure TGLCustomGLSLIvoryShader.DoApply(var rci: TGLRenderContextInfo;
113
GetGLSLProg.UseProgramObject;
117
function TGLCustomGLSLIvoryShader.DoUnApply(
118
var rci: TGLRenderContextInfo): Boolean;
121
GetGLSLProg.EndUseProgramObject;