private void PlatformInitialize(GraphicsDevice device)
        {
#if GLES
            SupportsNonPowerOfTwo = GL.Extensions.Contains("GL_OES_texture_npot") ||
                                    GL.Extensions.Contains("GL_ARB_texture_non_power_of_two") ||
                                    GL.Extensions.Contains("GL_IMG_texture_npot") ||
                                    GL.Extensions.Contains("GL_NV_texture_npot_2D_mipmap");
#else
            // Unfortunately non PoT texture support is patchy even on desktop systems and we can't
            // rely on the fact that GL2.0+ supposedly supports npot in the core.
            // Reference: http://aras-p.info/blog/2012/10/17/non-power-of-two-textures/
            SupportsNonPowerOfTwo = device._maxTextureSize >= 8192;
#endif

            SupportsTextureFilterAnisotropic = GL.Extensions.Contains("GL_EXT_texture_filter_anisotropic");

#if GLES
            SupportsDepth24            = GL.Extensions.Contains("GL_OES_depth24");
            SupportsPackedDepthStencil = GL.Extensions.Contains("GL_OES_packed_depth_stencil");
            SupportsDepthNonLinear     = GL.Extensions.Contains("GL_NV_depth_nonlinear");
            SupportsTextureMaxLevel    = GL.Extensions.Contains("GL_APPLE_texture_max_level");
#else
            SupportsDepth24            = true;
            SupportsPackedDepthStencil = true;
            SupportsDepthNonLinear     = false;
            SupportsTextureMaxLevel    = true;
#endif
            // Texture compression
            SupportsS3tc = GL.Extensions.Contains("GL_EXT_texture_compression_s3tc") ||
                           GL.Extensions.Contains("GL_OES_texture_compression_S3TC") ||
                           GL.Extensions.Contains("GL_EXT_texture_compression_dxt3") ||
                           GL.Extensions.Contains("GL_EXT_texture_compression_dxt5");
            SupportsDxt1  = SupportsS3tc || GL.Extensions.Contains("GL_EXT_texture_compression_dxt1");
            SupportsPvrtc = GL.Extensions.Contains("GL_IMG_texture_compression_pvrtc");
            SupportsEtc1  = GL.Extensions.Contains("GL_OES_compressed_ETC1_RGB8_texture");
            SupportsAtitc = GL.Extensions.Contains("GL_ATI_texture_compression_atitc") ||
                            GL.Extensions.Contains("GL_AMD_compressed_ATC_texture");

            // Framebuffer objects
#if GLES
            SupportsFramebufferObjectARB = GL.BoundApi == GL.RenderApi.ES && (device.glMajorVersion >= 2 || GL.Extensions.Contains("GL_ARB_framebuffer_object")); // always supported on GLES 2.0+
            SupportsFramebufferObjectEXT = GL.Extensions.Contains("GL_EXT_framebuffer_object");;
            SupportsFramebufferObjectIMG = GL.Extensions.Contains("GL_IMG_multisampled_render_to_texture") |
                                           GL.Extensions.Contains("GL_APPLE_framebuffer_multisample") |
                                           GL.Extensions.Contains("GL_EXT_multisampled_render_to_texture") |
                                           GL.Extensions.Contains("GL_NV_framebuffer_multisample");
#else
            // if we're on GL 3.0+, frame buffer extensions are guaranteed to be present, but extensions may be missing
            // it is then safe to assume that GL_ARB_framebuffer_object is present so that the standard function are loaded
            SupportsFramebufferObjectARB = device.glMajorVersion >= 3 || GL.Extensions.Contains("GL_ARB_framebuffer_object");
            SupportsFramebufferObjectEXT = GL.Extensions.Contains("GL_EXT_framebuffer_object");
#endif
            // Anisotropic filtering
            int anisotropy = 0;
            if (SupportsTextureFilterAnisotropic)
            {
                GL.GetInteger((GetPName)GetParamName.MaxTextureMaxAnisotropyExt, out anisotropy);
                GraphicsExtensions.CheckGLError();
            }
            MaxTextureAnisotropy = anisotropy;

            // sRGB
#if GLES
            SupportsSRgb = GL.Extensions.Contains("GL_EXT_sRGB");
#else
            SupportsSRgb = GL.Extensions.Contains("GL_EXT_texture_sRGB") && GL.Extensions.Contains("GL_EXT_framebuffer_sRGB");
#endif

            // TODO: Implement OpenGL support for texture arrays
            // once we can author shaders that use texture arrays.
            SupportsTextureArrays = false;

            SupportsDepthClamp = GL.Extensions.Contains("GL_ARB_depth_clamp");

            SupportsVertexTextures = false; // For now, until we implement vertex textures in OpenGL.


            GL.GetInteger((GetPName)GetParamName.MaxSamples, out _maxMultiSampleCount);

#if GLES
            SupportsInstancing = false;
#else
            SupportsInstancing = GL.VertexAttribDivisor != null;
#endif
        }
예제 #2
0
파일: Shader.cs 프로젝트: hadow/Commander
        public Shader(string name)
        {
            var vertexShader   = CompileShaderObject(ShaderType.VertexShader, name);
            var fragmentShader = CompileShaderObject(ShaderType.FragmentShader, name);

            program = GL.CreateProgram();
            GraphicsExtensions.CheckGLError();
            GL.BindAttribLocation(program, VertexPosAttributeIndex, "aVertexPosition");
            GraphicsExtensions.CheckGLError();
            GL.BindAttribLocation(program, TexCoordAttributeIndex, "aVertexTexCoord");
            GraphicsExtensions.CheckGLError();
            GL.BindAttribLocation(program, TexMetadataAttributeIndex, "aVertexTexMetadata");
            GraphicsExtensions.CheckGLError();
            GL.AttachShader(program, vertexShader);
            GraphicsExtensions.CheckGLError();
            GL.AttachShader(program, fragmentShader);
            GraphicsExtensions.CheckGLError();
            GL.LinkProgram(program);
            GraphicsExtensions.CheckGLError();
            int success;

            GL.GetProgram(program, GetProgramParameterName.LinkStatus, out success);
            GraphicsExtensions.CheckGLError();
            if (success == 0)
            {
                var log = GL.GetProgramInfoLog(program);
                GraphicsExtensions.CheckGLError();
                GL.DetachShader(program, vertexShader);
                GraphicsExtensions.CheckGLError();
                GL.DetachShader(program, fragmentShader);
                GraphicsExtensions.CheckGLError();

                throw new InvalidOperationException("Unable to link effect program.");
            }

            GL.UseProgram(program);
            GraphicsExtensions.CheckGLError();
            int numUniforms;

            //GL.GetProgram(program, GetProgramParameterName.LogLength, out numUniforms);
            GL.GetProgram(program, GetProgramParameterName.ActiveUniforms, out numUniforms);
            GraphicsExtensions.CheckGLError();

            var nextTexUnit = 0;

            for (var i = 0; i < numUniforms; i++)
            {
                int length, size;
                int type;
                var sb = new StringBuilder(128);
                GL.GetActiveUniform(program, i, 128, out length, out size, out type, sb);
                GraphicsExtensions.CheckGLError();
                var sampler = sb.ToString();

                if (type == 35678)
                {
                    samplers.Add(sampler, nextTexUnit);

                    var loc = GL.GetUniformLocation(program, sampler);
                    GraphicsExtensions.CheckGLError();
                    GL.Uniform1(loc, nextTexUnit);
                    GraphicsExtensions.CheckGLError();
                    nextTexUnit++;
                }
            }
        }
예제 #3
0
 public void DisableScissor()
 {
     Threading.EnsureUIThread();
     GL.Disable(EnableCap.ScissorTest);
     GraphicsExtensions.CheckGLError();
 }
예제 #4
0
 public void ClearDepthBuffer()
 {
     Threading.EnsureUIThread();
     GL.Clear(ClearBufferMask.DepthBufferBit);
     GraphicsExtensions.CheckGLError();
 }
예제 #5
0
 public void DisableDepthBuffer()
 {
     Threading.EnsureUIThread();
     GL.Disable(EnableCap.DepthTest);
     GraphicsExtensions.CheckGLError();
 }
예제 #6
0
 public void DrawPrimitives(PrimitiveType pt, int firstVertex, int numVertices)
 {
     GL.DrawArrays(ModelFromPrimitiveType(pt), firstVertex, numVertices);
     GraphicsExtensions.CheckGLError();
 }
예제 #7
0
 public Texture()
 {
     GL.GenTextures(1, out texture);
     GraphicsExtensions.CheckGLError();
 }