Exemple #1
0
        public Texture(GraphicsDevice dev)
        {
            this.dev = dev;

            Gl.glGenTextures(1, out texture);
            GraphicsDevice.CheckGlError();
        }
Exemple #2
0
        public Texture(GraphicsDevice dev, Bitmap bitmap)
        {
            this.dev = dev;

            Gl.glGenTextures(1, out texture);
            GraphicsDevice.CheckGlError();
            SetData(bitmap);
        }
Exemple #3
0
 public IndexBuffer(GraphicsDevice dev, int size)
 {
     Gl.glGenBuffers(1, out buffer);
     GraphicsDevice.CheckGlError();
     Bind();
     Gl.glBufferData(Gl.GL_ELEMENT_ARRAY_BUFFER,
         new IntPtr(sizeof(ElemType) * size),
         new ElemType[ size ],
         Gl.GL_DYNAMIC_DRAW);
     GraphicsDevice.CheckGlError();
 }
Exemple #4
0
        public Shader(GraphicsDevice dev, string type)
        {
            // Vertex shader
            string vertexCode;
            using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, type))))
                vertexCode = file.ReadToEnd();

            int v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB);
            GraphicsDevice.CheckGlError();
            Gl.glShaderSourceARB(v,1,new string[]{vertexCode},null);
            GraphicsDevice.CheckGlError();
            Gl.glCompileShaderARB(v);
            GraphicsDevice.CheckGlError();

            int success;
            Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
            GraphicsDevice.CheckGlError();
            if (success == 0)
                throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, type));

            // Fragment shader
            string fragmentCode;
            using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, type))))
                fragmentCode = file.ReadToEnd();
            int f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB);
            GraphicsDevice.CheckGlError();
            Gl.glShaderSourceARB(f,1,new string[]{fragmentCode},null);
            GraphicsDevice.CheckGlError();
            Gl.glCompileShaderARB(f);
            GraphicsDevice.CheckGlError();

            Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
            GraphicsDevice.CheckGlError();
            if (success == 0)
                throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, type));

            // Assemble program
            program = Gl.glCreateProgramObjectARB();
            GraphicsDevice.CheckGlError();
            Gl.glAttachObjectARB(program,v);
            GraphicsDevice.CheckGlError();
            Gl.glAttachObjectARB(program,f);
            GraphicsDevice.CheckGlError();

            Gl.glLinkProgramARB(program);
            GraphicsDevice.CheckGlError();

            Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success);
            GraphicsDevice.CheckGlError();
            if (success == 0)
                throw new InvalidProgramException("Linking error in {0} shader".F(type));

            Gl.glUseProgramObjectARB(program);
            GraphicsDevice.CheckGlError();

            int numUniforms;
            Gl.glGetObjectParameterivARB( program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms );
            GraphicsDevice.CheckGlError();

            int nextTexUnit = 1;
            for( int i = 0 ; i < numUniforms ; i++ )
            {
                int uLen, uSize, uType;
                var sb = new StringBuilder(128);
                Gl.glGetActiveUniformARB( program, i, 128, out uLen, out uSize, out uType, sb );
                GraphicsDevice.CheckGlError();
                if( uType == Gl.GL_SAMPLER_2D_ARB )
                {
                    samplers.Add( sb.ToString(), nextTexUnit );
                    Gl.glUniform1iARB( i, nextTexUnit );
                    ++nextTexUnit;
                }
            }
        }