diff options
Diffstat (limited to 'demo/first_person/shader.lua')
-rw-r--r-- | demo/first_person/shader.lua | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/demo/first_person/shader.lua b/demo/first_person/shader.lua new file mode 100644 index 0000000..6cbf0aa --- /dev/null +++ b/demo/first_person/shader.lua @@ -0,0 +1,73 @@ +local Shader = {} +local gl = honey.gl +setmetatable(Shader, {__index=_G}) +setfenv(1, Shader) + + +--===== creation =====-- + +function Create(vertexSource, fragmentSource) + local self = {} + setmetatable(self, {__index=Shader}) + + -- vertex shader + local vertexShader = gl.CreateShader(gl.VERTEX_SHADER) + gl.ShaderSource(vertexShader, vertexSource) + gl.CompileShader(vertexShader) + + -- fragment shader + local fragmentShader = gl.CreateShader(gl.FRAGMENT_SHADER) + gl.ShaderSource(fragmentShader, fragmentSource) + gl.CompileShader(fragmentShader) + + -- link + self.program = gl.CreateProgram() + gl.AttachShader(self.program, vertexShader) + gl.AttachShader(self.program, fragmentShader) + gl.LinkProgram(self.program) + + -- clean up + gl.DeleteShader(vertexShader) + gl.DeleteShader(fragmentShader) + + return self +end + + +function Load(vertexFile, fragmentFile) + local vf = io.open(vertexFile) + local vsource = vf:read('*a') + vf:close() + + local ff = io.open(fragmentFile) + local fsource = ff:read('*a') + ff:close() + + return Create(vsource, fsource) +end + + +--===== methods =====-- + +function Use(self) + gl.UseProgram(self.program) +end + +function SetMatrix(self, name, matrix) + gl.UseProgram(self.program) + local location = gl.GetUniformLocation(self.program, name) + gl.UniformMatrix4fv(location, false, matrix) +end + + +function SetTexture(self, name, texture) + self:Use() + gl.BindTexture(gl.TEXTURE_2D, texture) + local location = gl.GetUniformLocation(self.program, name) + gl.Uniform1i(location, 0) +end + + +--===== fin =====-- + +return Shader |