protected override void CreateFrameBuffer() { try { ContextRenderingApi = EAGLRenderingAPI.OpenGLES3; float screenScale = UIScreen.MainScreen.Scale; CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; Size size = new Size( (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Width), (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Height)); base.CreateFrameBuffer(); GL.GenRenderbuffers(1, out depthRenderbuffer); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthRenderbuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, size.Width, size.Height); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, depthRenderbuffer); Console.WriteLine("using ES 3.0"); Console.WriteLine("version: {0} glsl version: {1}", GL.GetString(StringName.Version), GL.GetString(StringName.ShadingLanguageVersion)); } catch (Exception e) { throw new Exception("Looks like OpenGL ES 3.0 not available", e); } if (ContextRenderingApi == EAGLRenderingAPI.OpenGLES2 || ContextRenderingApi == EAGLRenderingAPI.OpenGLES3) { keys.LoadShaders(); } }
/// <summary> /// ICreate an ES 2.0 context /// </summary> /// <param name='context'> /// Context. /// </param> /// <param name='drawable'> /// Drawable. /// </param> public void InitWithContext(EAGLContext context, CAEAGLLayer drawable) { GL.GenFramebuffers(1, out m_defaultFBOName); // Create default framebuffer object. The backing will be allocated for the current layer in resizeFromLayer GL.GenRenderbuffers(1, out m_colorRenderbuffer); GL.BindFramebuffer(FramebufferTarget.Framebuffer, m_defaultFBOName); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_colorRenderbuffer); m_context = context; // This call associates the storage for the current render buffer with the EAGLDrawable (our CAEGLLAyer) // allowing us to draw into a buffer that will later be rendered to the screen wherever the layer is //(which correspondes with our) view. m_context.RenderBufferStorage((uint)All.Renderbuffer, drawable); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.ColorAttachment0, RenderbufferTarget.Renderbuffer, m_colorRenderbuffer); int backingWidth; int backingHeight; GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferWidth, out backingWidth); GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferHeight, out backingHeight); GL.GenRenderbuffers(1, out m_depthRenderbuffer); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_depthRenderbuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, backingWidth, backingHeight); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, m_depthRenderbuffer); var frameBufferError = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if(frameBufferError != FramebufferErrorCode.FramebufferComplete) { throw new ApplicationException("Failed to make complete framebuffer object: " + frameBufferError); } InitWithDefaultFBO(m_defaultFBOName); }
protected override void CreateFrameBuffer() { Debug.WriteLine("IOS Game View create frame buffer"); OpenTK.Toolkit.Init(); nfloat screenScale = UIScreen.MainScreen.Scale; CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; //CGSize size = new CGSize( // (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Width), // (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Height)); try { ContextRenderingApi = EAGLRenderingAPI.OpenGLES2; //OpenTK.Graphics.OpenGL.LoadAll(); //OpenTK.Graphics.ES20.GL.ClearColor(1f, 1f, 1f, 1f); base.CreateFrameBuffer(); Console.WriteLine("using ES 2.0"); Console.WriteLine("version: {0} glsl version: {1}", GL.GetString(StringName.Version), GL.GetString(StringName.ShadingLanguageVersion)); } catch (Exception e) { Debug.WriteLine(e.ToString()); throw new Exception("Looks like OpenGL ES 2.0 not available", e); } }
private void CreateFrameBuffer(CAEAGLLayer eaglLayer) { int oldRenderbuffer = 1; gl.GetInteger(All.RenderbufferBindingOes, out oldRenderbuffer); gl.GenRenderbuffers(1, out renderbuffer); gl.BindRenderbuffer(All.RenderbufferOes, renderbuffer); if (!EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer)) { gl.DeleteRenderbuffers(1, ref renderbuffer); renderbuffer = 0; gl.BindRenderbuffer(All.RenderbufferBindingOes, oldRenderbuffer); throw new InvalidOperationException("Error with EAGLContext.RenderBufferStorage!"); } gl.BindFramebuffer(All.FramebufferOes, framebuffer); gl.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer); Size newSize = new Size( (int)Math.Round(eaglLayer.Bounds.Size.Width), (int)Math.Round(eaglLayer.Bounds.Size.Height)); Size = newSize; gl.Viewport(0, 0, newSize.Width, newSize.Height); gl.Scissor(0, 0, newSize.Width, newSize.Height); }
protected override void ConfigureLayer(CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; ExclusiveTouch = true; MultipleTouchEnabled = true; UserInteractionEnabled = true; }
void CreateSurface() { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; if (!_context.IsCurrent) { _context.MakeCurrent(null); } var newSize = eaglLayer.Bounds.Size; newSize.Width = (float)Math.Round(newSize.Width); newSize.Height = (float)Math.Round(newSize.Height); int oldRenderbuffer = 0, oldFramebuffer = 0; GL.GetInteger(All.RenderbufferBindingOes, ref oldRenderbuffer); GL.GetInteger(All.FramebufferBindingOes, ref oldFramebuffer); GL.Oes.GenRenderbuffers(1, ref _renderbuffer); GL.Oes.BindRenderbuffer(All.RenderbufferOes, _renderbuffer); if (!_context.EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer)) { GL.Oes.DeleteRenderbuffers(1, ref _renderbuffer); GL.Oes.BindRenderbuffer(All.RenderbufferBindingOes, (uint)oldRenderbuffer); throw new InvalidOperationException("Error with RenderbufferStorage()!"); } GL.Oes.GenFramebuffers(1, ref _framebuffer); GL.Oes.BindFramebuffer(All.FramebufferOes, _framebuffer); GL.Oes.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, _renderbuffer); if (_depthFormat != 0) { GL.Oes.GenRenderbuffers(1, ref _depthbuffer); GL.Oes.BindFramebuffer(All.RenderbufferOes, _depthbuffer); GL.Oes.RenderbufferStorage(All.RenderbufferOes, _depthFormat, (int)newSize.Width, (int)newSize.Height); GL.Oes.FramebufferRenderbuffer(All.FramebufferOes, All.DepthAttachmentOes, All.RenderbufferOes, _depthbuffer); } _size = newSize; if (!_hasBeenCurrent) { GL.Viewport(0, 0, (int)newSize.Width, (int)newSize.Height); GL.Scissor(0, 0, (int)newSize.Width, (int)newSize.Height); _hasBeenCurrent = true; } else { GL.Oes.BindFramebuffer(All.FramebufferOes, (uint)oldFramebuffer); } GL.Oes.BindRenderbuffer(All.RenderbufferOes, (uint)oldRenderbuffer); Action <EAGLView> a = OnResized; if (a != null) { a(this); } }
protected override void ConfigureLayer(CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; // Grisha: support retina displays // read // http://stackoverflow.com/questions/4884176/retina-display-image-quality-problem/9644622 // for more information. eaglLayer.ContentsScale = screenScale; }
private LayerFbo(EAGLContext context, GlInterface gl, CAEAGLLayer layer, int framebuffer, int renderbuffer, int depthBuffer) { _context = context; _gl = gl; _layer = layer; _framebuffer = framebuffer; _renderbuffer = renderbuffer; _depthBuffer = depthBuffer; }
void SetupProjection() { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; int width = (int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Width); int height = (int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Height); cube.SetupProjection(width, height); GL.Viewport(0, 0, width, height); }
private void CreateFrameBuffer() { // Setup layer eaglLayer = (CAEAGLLayer)this.Layer; eaglLayer.Opaque = false; bool layerRetainsBacking = false; NSString layerColorFormat = EAGLColorFormat.RGBA8; eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(new NSObject[] { NSNumber.FromBoolean(layerRetainsBacking), layerColorFormat }, new NSObject[] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }); // Create OpenGL drawing context EAGLRenderingAPI api = EAGLRenderingAPI.OpenGLES2; context = new EAGLContext(api); if (context == null) { throw new InvalidOperationException("Failed to initialize OpenGLES 2.0 context"); } if (!EAGLContext.SetCurrentContext(context)) { throw new InvalidOperationException("Failed to set current OpenGL context"); } // Create render buffer and assign it to the context GL.GenRenderbuffers(1, ref colorRenderBuffer); GL.BindRenderbuffer(All.Renderbuffer, colorRenderBuffer); context.RenderBufferStorage((uint)All.Renderbuffer, eaglLayer); // Create frame buffer uint frameBuffer = 0; GL.GenFramebuffers(1, ref frameBuffer); GL.BindFramebuffer(All.Framebuffer, frameBuffer); GL.FramebufferRenderbuffer(All.Framebuffer, All.ColorAttachment0, All.Renderbuffer, colorRenderBuffer); // Create CADisplayLink for animation loop displayLink = CADisplayLink.Create(this, new Selector("render")); displayLink.FrameInterval = 1; displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode); }
/// <summary> /// Resizes the frame buffer. /// On IOS, when the device is rotated from portrait to landscape, if the framebuffer is not recreated /// then the EAGLContext will stretch the render buffer to fit the screen. /// If you care at all about aspect ratio, then this behavior is not desired, and in that case this method /// should be called when rotating the device. /// See here: http://stackoverflow.com/questions/20326947/opengl-what-need-to-reconfig-when-rotate-screen /// And also here: https://gamedev.stackexchange.com/questions/75965/how-do-i-reconfigure-my-gles-frame-buffer-after-a-rotation /// </summary> public void ResizeFrameBuffer() { MakeCurrent(); gl.DeleteRenderbuffers(1, ref renderbuffer); CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; CreateFrameBuffer(eaglLayer); }
protected override void ConfigureLayer(CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; // Scale OpenGL layer to the scale of the main layer // On iPhone 4 this makes the renderbuffer size the same as actual device resolution // On iPad with user-selected scale of 2x at startup, this will trigger but has no effect on the renderbuffer if (UIScreen.MainScreen.Scale != 1) { eaglLayer.ContentsScale = UIScreen.MainScreen.Scale; } }
protected virtual void CreateFrameBuffer() { AssertValid(); if (LayerColorFormat == null) { throw new InvalidOperationException("Set the LayerColorFormat property to an EAGLColorFormat value before calling Run()."); } CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys( new NSObject [] { NSNumber.FromBoolean(LayerRetainsBacking), LayerColorFormat }, new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat } ); ConfigureLayer(eaglLayer); GraphicsContext = Utilities.CreateGraphicsContext(ContextRenderingApi); gl = GLCalls.GetGLCalls(ContextRenderingApi); int oldFramebuffer = 0, oldRenderbuffer = 1; gl.GetInteger(All.FramebufferBindingOes, ref oldFramebuffer); gl.GetInteger(All.RenderbufferBindingOes, ref oldRenderbuffer); gl.GenRenderbuffers(1, ref renderbuffer); gl.BindRenderbuffer(All.RenderbufferOes, renderbuffer); if (!EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer)) { gl.DeleteRenderbuffers(1, ref renderbuffer); renderbuffer = 0; gl.BindRenderbuffer(All.RenderbufferBindingOes, oldRenderbuffer); throw new InvalidOperationException("Error with EAGLContext.RenderBufferStorage!"); } gl.GenFramebuffers(1, ref framebuffer); gl.BindFramebuffer(All.FramebufferOes, framebuffer); gl.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer); Size newSize = new Size( (int)Math.Round(eaglLayer.Bounds.Size.Width), (int)Math.Round(eaglLayer.Bounds.Size.Height)); Size = newSize; gl.Viewport(0, 0, newSize.Width, newSize.Height); gl.Scissor(0, 0, newSize.Width, newSize.Height); frameBufferWindow = new WeakReference(Window); frameBufferLayer = new WeakReference(Layer); }
public EAGLView(CGRect frame, All format, All depth, bool retained) : base(frame) { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.DrawableProperties = new NSDictionary( EAGLDrawableProperty.RetainedBacking, true, EAGLDrawableProperty.ColorFormat, EAGLColorFormat.RGBA8 ); _depthFormat = depth; _context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation; CreateSurface(); }
public EAGLView(RectangleF frame, All format, All depth, bool retained) : base(frame) { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys( new NSObject [] { NSNumber.FromBoolean(true), EAGLColorFormat.RGBA8 }, new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat } ); _format = format; _depthFormat = depth; _context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation; CreateSurface(); }
public EAGLView(NSCoder coder) : base(coder) { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.Opaque = true; eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys( new NSObject [] { NSNumber.FromBoolean(false), EAGLColorFormat.RGBA8 }, new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat } ); Context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation; Context.MakeCurrent(null); AnimationInterval = 1.0 / 60.0; }
public EAGLView(NSCoder coder) : base(coder) { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.Opaque = true; eaglLayer.DrawableProperties = new NSDictionary( EAGLDrawableProperty.RetainedBacking, false, EAGLDrawableProperty.ColorFormat, EAGLColorFormat.RGBA8 ); Context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation; Context.MakeCurrent(null); AnimationInterval = 1.0 / 60.0; }
public GLView() : base() { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.Opaque = true; context = new EAGLContext(EAGLRenderingAPI.OpenGLES2); if (context == null || !EAGLContext.SetCurrentContext(context)) { return; } animating = false; AnimationFrameInterval = 2; }
public static LayerFbo TryCreate(EAGLContext context, GlInterface gl, CAEAGLLayer layer) { if (context != EAGLContext.CurrentContext) { return(null); } var fb = new int[2]; var rb = new int[2]; var db = new int[2]; gl.GenRenderbuffers(1, rb); gl.BindRenderbuffer(GlConsts.GL_RENDERBUFFER, rb[0]); context.RenderBufferStorage(GlConsts.GL_RENDERBUFFER, layer); gl.GenFramebuffers(1, fb); gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, fb[0]); gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_COLOR_ATTACHMENT0, GlConsts.GL_RENDERBUFFER, rb[0]); int[] w = new int[1]; int[] h = new int[1]; gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_WIDTH, w); gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_HEIGHT, h); gl.GenRenderbuffers(1, db); //GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthBuffer); //GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, w, h); gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_DEPTH_ATTACHMENT, GlConsts.GL_RENDERBUFFER, db[0]); var frameBufferError = gl.CheckFramebufferStatus(GlConsts.GL_FRAMEBUFFER); if (frameBufferError != GlConsts.GL_FRAMEBUFFER_COMPLETE) { gl.DeleteFramebuffers(1, fb); gl.DeleteRenderbuffers(1, db); gl.DeleteRenderbuffers(1, rb); return(null); } return(new LayerFbo(context, gl, layer, fb, rb, db) { Width = w[0], Height = h[0] }); }
protected virtual void CreateFrameBuffer() { AssertValid(); if (LayerColorFormat == null) { throw new InvalidOperationException("Set the LayerColorFormat property to an EAGLColorFormat value before calling Run()."); } CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys( new NSObject [] { NSNumber.FromBoolean(LayerRetainsBacking), LayerColorFormat }, new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat } ); ConfigureLayer(eaglLayer); int major = 0, minor = 0; switch (ContextRenderingApi) { case EAGLRenderingAPI.OpenGLES1: major = 1; minor = 1; break; case EAGLRenderingAPI.OpenGLES2: major = 2; minor = 0; break; case EAGLRenderingAPI.OpenGLES3: major = 3; minor = 0; break; default: throw new ArgumentException("Unsupported EAGLRenderingAPI version: " + ContextRenderingApi); } GraphicsContext = new GraphicsContext(GraphicsMode.Default, WindowInfo, major, minor, GraphicsContextFlags.Embedded); GraphicsContext.MakeCurrent(WindowInfo); gl = GLCalls.GetGLCalls(ContextRenderingApi); int oldFramebuffer = 0; gl.GetInteger(All.FramebufferBindingOes, out oldFramebuffer); gl.GenFramebuffers(1, out framebuffer); CreateFrameBuffer(eaglLayer); frameBufferWindow = new WeakReference(Window); frameBufferLayer = new WeakReference(Layer); }
public RosyWriterPreviewWindow(RectangleF frame) : base(frame) { // Use 2x scale factor on Retina dispalys. ContentScaleFactor = UIScreen.MainScreen.Scale; // Initialize OpenGL ES 2 CAEAGLLayer eagleLayer = (CAEAGLLayer)Layer; eagleLayer.Opaque = true; eagleLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys( new object[] { NSNumber.FromBoolean(false), EAGLColorFormat.RGBA8 }, new object[] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat } ); Context = new EAGLContext(EAGLRenderingAPI.OpenGLES2); if (!EAGLContext.SetCurrentContext(Context)) { throw new ApplicationException("Could not set EAGLContext"); } }
public EAGLView(RectangleF frame) : base(frame) { CAEAGLLayer eagl = (CAEAGLLayer)Layer; eagl.DrawableProperties = NSDictionary.FromObjectsAndKeys(new NSObject[] { NSNumber.FromBoolean(true), EAGLColorFormat.RGBA8 }, new NSObject[] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }); eagl.ContentsScale = UIScreen.MainScreen.Scale; context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation; CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; context.MakeCurrent(null); GL.Oes.GenRenderbuffers(1, out renderbuffer); GL.Oes.BindRenderbuffer(All.RenderbufferOes, renderbuffer); if (!context.EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer)) { throw new InvalidOperationException("Error with RenderbufferStorage()!"); } GL.Oes.GenFramebuffers(1, out frameBuffer); GL.Oes.BindFramebuffer(All.FramebufferOes, frameBuffer); GL.Oes.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer); Instance = this; Opaque = true; ExclusiveTouch = true; MultipleTouchEnabled = true; UserInteractionEnabled = true; }
protected override void CreateFrameBuffer() { // Fetch desired depth / stencil size // Need to more robustly handle RemoveExistingView(); CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; if (bufferCreated || eaglLayer.Bounds.Size.Width == 0 || eaglLayer.Bounds.Size.Height == 0) { return; } base.CreateFrameBuffer(); MakeCurrent(); var newSize = new System.Drawing.Size( (int)Math.Round(eaglLayer.Bounds.Size.Width * Layer.ContentsScale), (int)Math.Round(eaglLayer.Bounds.Size.Height * Layer.ContentsScale)); GL.GenRenderbuffers(1, out depthbuffer); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthbuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, newSize.Width, newSize.Height); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, depthbuffer); Threading.BackgroundContext = new OpenGLES.EAGLContext(EAGLContext.API, EAGLContext.ShareGroup); Size = newSize; Initialise(); // For iOS, MonoGame's GraphicsDevice needs to maintain reference to default framebuffer graphicsDevice.glFramebuffer = Framebuffer; bufferCreated = true; }
public bool ResizeFromLayer(CAEAGLLayer layer) { // The pixel dimensions of the CAEAGLLayer int backingWidth; int backingHeight; // Allocate color buffer backing based on the current layer size GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_colorRenderbuffer); m_context.RenderBufferStorage((uint)RenderbufferTarget.Renderbuffer, layer); GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferWidth, out backingWidth); GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferHeight, out backingHeight); GL.GenRenderbuffers(1, out m_depthRenderbuffer); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_depthRenderbuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, backingWidth, backingHeight); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, m_depthRenderbuffer); base.ResizeWithWidth(backingWidth, backingHeight); if(GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) { Console.WriteLine("Failed to make complete framebuffer object", GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer)); return false; } return true; }
public EaglLayerSurface(CAEAGLLayer layer) { _layer = layer; }
void SetupProjection() { CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; cube.SetupProjection((int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Width), (int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Height)); }
protected override void ConfigureLayer(CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; }
private void CreateFrameBuffer() { // Setup layer eaglLayer = (CAEAGLLayer)this.Layer; eaglLayer.Opaque = false; bool layerRetainsBacking = false; NSString layerColorFormat = EAGLColorFormat.RGBA8; eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(new NSObject[] { NSNumber.FromBoolean(layerRetainsBacking), layerColorFormat }, new NSObject[] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }); // Create OpenGL drawing context EAGLRenderingAPI api = EAGLRenderingAPI.OpenGLES2; context = new EAGLContext(api); if (context == null) { throw new InvalidOperationException("Failed to initialize OpenGLES 2.0 context"); } if (!EAGLContext.SetCurrentContext(context)) { throw new InvalidOperationException("Failed to set current OpenGL context"); } // Create size for use later size = new Size((int)Math.Round((double)eaglLayer.Bounds.Size.Width), (int)Math.Round((double)eaglLayer.Bounds.Size.Height)); // Create depth buffer (you have to do this BEFORE creating the color buffer) GL.GenRenderbuffers(1, ref depthRenderBuffer); GL.BindRenderbuffer(All.Renderbuffer, depthRenderBuffer); GL.RenderbufferStorage(All.Renderbuffer, All.DepthComponent16, size.Width, size.Height); // Create color buffer and allocate storage through the context (as a special case for this particular buffer) GL.GenRenderbuffers(1, ref colorRenderBuffer); GL.BindRenderbuffer(All.Renderbuffer, colorRenderBuffer); context.RenderBufferStorage((uint)All.Renderbuffer, eaglLayer); // Create frame buffer uint frameBuffer = 0; GL.GenFramebuffers(1, ref frameBuffer); GL.BindFramebuffer(All.Framebuffer, frameBuffer); GL.FramebufferRenderbuffer(All.Framebuffer, All.ColorAttachment0, All.Renderbuffer, colorRenderBuffer); GL.FramebufferRenderbuffer(All.Framebuffer, All.DepthAttachment, All.Renderbuffer, depthRenderBuffer); // Set viewport GL.Viewport(0, 0, size.Width, size.Height); // Create CADisplayLink for animation loop displayLink = CADisplayLink.Create(this, new Selector("render")); displayLink.FrameInterval = 1; displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode); }
protected override void ConfigureLayer(CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; eaglLayer.AllowsEdgeAntialiasing = true; eaglLayer.EdgeAntialiasingMask = CAEdgeAntialiasingMask.All; }
protected override void ConfigureLayer (CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; eaglLayer.AllowsEdgeAntialiasing = true; eaglLayer.EdgeAntialiasingMask = CAEdgeAntialiasingMask.All; }
protected virtual void CreateFrameBuffer() { AssertValid(); if (LayerColorFormat == null) { throw new InvalidOperationException("Set the LayerColorFormat property to an EAGLColorFormat value before calling Run()."); } CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer; eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys( new NSObject [] { NSNumber.FromBoolean(LayerRetainsBacking), LayerColorFormat }, new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat } ); ConfigureLayer(eaglLayer); int major = 0, minor = 0; switch (ContextRenderingApi) { case EAGLRenderingAPI.OpenGLES1: major = 1; minor = 1; break; case EAGLRenderingAPI.OpenGLES2: major = 2; minor = 0; break; case EAGLRenderingAPI.OpenGLES3: major = 3; minor = 0; break; default: throw new ArgumentException("Unsupported EAGLRenderingAPI version: " + ContextRenderingApi); } GraphicsContext = new GraphicsContext(GraphicsMode.Default, WindowInfo, major, minor, GraphicsContextFlags.Embedded); GraphicsContext.MakeCurrent(WindowInfo); gl = GLCalls.GetGLCalls(ContextRenderingApi); int oldFramebuffer = 0, oldRenderbuffer = 1; gl.GetInteger(All.FramebufferBindingOes, out oldFramebuffer); gl.GetInteger(All.RenderbufferBindingOes, out oldRenderbuffer); gl.GenRenderbuffers(1, out renderbuffer); gl.BindRenderbuffer(All.RenderbufferOes, renderbuffer); if (!EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer)) { gl.DeleteRenderbuffers(1, ref renderbuffer); renderbuffer = 0; gl.BindRenderbuffer(All.RenderbufferBindingOes, oldRenderbuffer); throw new InvalidOperationException("Error with EAGLContext.RenderBufferStorage!"); } gl.GenFramebuffers(1, out framebuffer); gl.BindFramebuffer(All.FramebufferOes, framebuffer); gl.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer); Size newSize = new Size( (int)Math.Round(eaglLayer.Bounds.Size.Width), (int)Math.Round(eaglLayer.Bounds.Size.Height)); Size = newSize; gl.Viewport(0, 0, newSize.Width, newSize.Height); gl.Scissor(0, 0, newSize.Width, newSize.Height); frameBufferWindow = new WeakReference(Window); frameBufferLayer = new WeakReference(Layer); }
protected virtual void ConfigureLayer(CAEAGLLayer eaglLayer) { }
protected override void ConfigureLayer(CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; // Scale OpenGL layer to the scale of the main layer // On iPhone 4 this makes the renderbuffer size the same as actual device resolution // On iPad with user-selected scale of 2x at startup, this will trigger but has no effect on the renderbuffer if(UIScreen.MainScreen.Scale != 1) eaglLayer.ContentsScale = UIScreen.MainScreen.Scale; }
public SizeSynchronizedLayerFbo(EAGLContext context, GlInterface gl, CAEAGLLayer layer) { _context = context; _gl = gl; _layer = layer; }
protected override void ConfigureLayer (CAEAGLLayer eaglLayer) { eaglLayer.Opaque = true; }
private LayerFbo(EAGLContext context, CAEAGLLayer layer, in int framebuffer, in int renderbuffer, in int depthBuffer)