public GraphicsDevice(Size size, WindowMode window) { Console.WriteLine("Using Cg renderer"); windowSize = size; var extensions = new [] { "GL_ARB_vertex_program", "GL_ARB_fragment_program", "GL_ARB_vertex_buffer_object", }; surf = SdlGraphics.InitializeSdlGl(ref windowSize, window, extensions); cgContext = Tao.Cg.Cg.cgCreateContext(); Tao.Cg.Cg.cgSetErrorCallback(CgErrorCallback); Tao.Cg.CgGl.cgGLRegisterStates(cgContext); Tao.Cg.CgGl.cgGLSetManageTextureParameters(cgContext, true); vertexProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_VERTEX); fragmentProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_FRAGMENT); Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY); ErrorHandler.CheckGlError(); Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY); ErrorHandler.CheckGlError(); Sdl.SDL_SetModState(0); // i have had enough. input = new SdlInput(surf); }
public void SetVec(string name, float x, float y) { Gl.glUseProgramObjectARB(program); ErrorHandler.CheckGlError(); var param = Gl.glGetUniformLocationARB(program, name); ErrorHandler.CheckGlError(); Gl.glUniform2fARB(param, x, y); ErrorHandler.CheckGlError(); }
public void Render(Action a) { Gl.glUseProgramObjectARB(program); ErrorHandler.CheckGlError(); // Todo: Only enable alpha blending if we need it Gl.glEnable(Gl.GL_BLEND); ErrorHandler.CheckGlError(); Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA); ErrorHandler.CheckGlError(); a(); ErrorHandler.CheckGlError(); Gl.glDisable(Gl.GL_BLEND); ErrorHandler.CheckGlError(); }
public void SetMatrix(string name, float[] mtx) { if (mtx.Length != 16) { throw new InvalidDataException("Invalid 4x4 matrix"); } Gl.glUseProgramObjectARB(program); ErrorHandler.CheckGlError(); var param = Gl.glGetUniformLocationARB(program, name); ErrorHandler.CheckGlError(); Gl.glUniformMatrix4fv(param, 1, Gl.GL_FALSE, mtx); ErrorHandler.CheckGlError(); }
public void Render(Action a) { Gl.glUseProgramObjectARB(program); // bind the textures foreach (var kv in textures) { Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key); Gl.glBindTexture(Gl.GL_TEXTURE_2D, ((Texture)kv.Value).ID); } ErrorHandler.CheckGlError(); a(); ErrorHandler.CheckGlError(); }
public void EnableScissor(int left, int top, int width, int height) { if (width < 0) { width = 0; } if (height < 0) { height = 0; } Gl.glScissor(left, windowSize.Height - (top + height), width, height); ErrorHandler.CheckGlError(); Gl.glEnable(Gl.GL_SCISSOR_TEST); ErrorHandler.CheckGlError(); }
public void SetVec(string name, float[] vec, int length) { var param = Gl.glGetUniformLocationARB(program, name); ErrorHandler.CheckGlError(); switch (length) { case 1: Gl.glUniform1fv(param, 1, vec); break; case 2: Gl.glUniform2fv(param, 1, vec); break; case 3: Gl.glUniform3fv(param, 1, vec); break; case 4: Gl.glUniform4fv(param, 1, vec); break; default: throw new InvalidDataException("Invalid vector length"); } ErrorHandler.CheckGlError(); }
public void SetValue(string name, ITexture t) { if (t == null) { return; } Gl.glUseProgramObjectARB(program); ErrorHandler.CheckGlError(); var texture = (Texture)t; int texUnit; if (samplers.TryGetValue(name, out texUnit)) { Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + texUnit); ErrorHandler.CheckGlError(); Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture.texture); ErrorHandler.CheckGlError(); Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB); } }
public GraphicsDevice(Size size, WindowMode window) { Console.WriteLine("Using Gl renderer"); windowSize = size; var extensions = new [] { "GL_ARB_vertex_shader", "GL_ARB_fragment_shader", "GL_ARB_vertex_buffer_object", }; surf = SdlGraphics.InitializeSdlGl(ref windowSize, window, extensions); Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY); ErrorHandler.CheckGlError(); Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY); ErrorHandler.CheckGlError(); Sdl.SDL_SetModState(0); input = new SdlInput(surf); }
public void Render(Action a) { Gl.glUseProgramObjectARB(program); /* bind the textures */ foreach (var kv in textures) { Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key); Gl.glBindTexture(Gl.GL_TEXTURE_2D, ((Texture)kv.Value).texture); } /* configure blend state */ ErrorHandler.CheckGlError(); // TODO: Only enable alpha blending if we need it Gl.glEnable(Gl.GL_BLEND); ErrorHandler.CheckGlError(); Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA); ErrorHandler.CheckGlError(); a(); ErrorHandler.CheckGlError(); Gl.glDisable(Gl.GL_BLEND); ErrorHandler.CheckGlError(); }
public Shader(GraphicsDevice dev, string name) { // Vertex shader string vertexCode; using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name)))) vertexCode = file.ReadToEnd(); var v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB); ErrorHandler.CheckGlError(); Gl.glShaderSourceARB(v, 1, new string[] { vertexCode }, null); ErrorHandler.CheckGlError(); Gl.glCompileShaderARB(v); ErrorHandler.CheckGlError(); int success; Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success); ErrorHandler.CheckGlError(); if (success == 0) { throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, name)); } // Fragment shader string fragmentCode; using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name)))) fragmentCode = file.ReadToEnd(); var f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB); ErrorHandler.CheckGlError(); Gl.glShaderSourceARB(f, 1, new string[] { fragmentCode }, null); ErrorHandler.CheckGlError(); Gl.glCompileShaderARB(f); ErrorHandler.CheckGlError(); Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success); ErrorHandler.CheckGlError(); if (success == 0) { throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name)); } // Assemble program program = Gl.glCreateProgramObjectARB(); ErrorHandler.CheckGlError(); Gl.glAttachObjectARB(program, v); ErrorHandler.CheckGlError(); Gl.glAttachObjectARB(program, f); ErrorHandler.CheckGlError(); Gl.glLinkProgramARB(program); ErrorHandler.CheckGlError(); Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success); ErrorHandler.CheckGlError(); if (success == 0) { throw new InvalidProgramException("Linking error in {0} shader".F(name)); } Gl.glUseProgramObjectARB(program); ErrorHandler.CheckGlError(); int numUniforms; Gl.glGetObjectParameterivARB(program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms); ErrorHandler.CheckGlError(); int nextTexUnit = 0; for (var i = 0; i < numUniforms; i++) { int length, size, type; var sb = new StringBuilder(128); Gl.glGetActiveUniformARB(program, i, 128, out length, out size, out type, sb); var sampler = sb.ToString(); ErrorHandler.CheckGlError(); if (type == Gl.GL_SAMPLER_2D_ARB) { samplers.Add(sampler, nextTexUnit); var loc = Gl.glGetUniformLocationARB(program, sampler); ErrorHandler.CheckGlError(); Gl.glUniform1iARB(loc, nextTexUnit); ErrorHandler.CheckGlError(); nextTexUnit++; } } }
public void DisableScissor() { Gl.glDisable(Gl.GL_SCISSOR_TEST); ErrorHandler.CheckGlError(); }
public void SetLineWidth(float width) { Gl.glLineWidth(width); ErrorHandler.CheckGlError(); }