public void present() { if (needclearflag) { clear(0.5f, 1); needclearflag = false; } //***最后,重置渲染目标**** currentRenderTarget = backBufferRenderTarget; renderBufferAdapter.SetRenderBuffer(currentRenderTarget.renderTarget); }
/// <summary> /// 设置渲染缓冲区的视口尺寸和其他属性。 /// 渲染是双缓冲的。当调用 present() 方法时,后台缓冲区与可见的前台缓冲区交换。 /// 缓冲区的最小大小为 32 x 32 像素。 /// 配置缓冲区是一个缓慢的操作。在正常渲染操作期间,请避免更改缓冲区大小或属性。 /// /// </summary> public void configureBackBuffer(int width, int height, IRenderTargetAdapter renderBufferAdapter) { if (width < 32 || height < 32 || width % 2 != 0 || height % 2 != 0) { throw new ArgumentException("缓冲区的最小大小为 32 x 32 像素,并且必须是偶数"); } this.programConstants = new ProgramConstants(); this.quadFragementUnit = new QuadFragementUnit(); this.renderBufferAdapter = renderBufferAdapter; backBufferWidth = width; backBufferHeight = height; backBufferRenderTarget = new RenderTargetBind(); var backbuffer = new ScreenFrameBuffer(width, height, 1, 1); backBufferRenderTarget.renderTarget = backbuffer; backBufferRenderTarget.zBuffer = new ZBuffer(backbuffer.rt_width, backbuffer.rt_height); currentRenderTarget = backBufferRenderTarget; needclearflag = true; _culling = Context3DTriangleFace.NONE; _depthtest_depthMask = true; _depthtest_passCompareMode = Context3DCompareMode.ALWAYS; samplers = new Sampler[8]; for (int i = 0; i < samplers.Length; i++) { samplers[i] = new Sampler(); } if (backbuffer.rt_width == width && backbuffer.rt_height == height) { DebugBuffer = new debugger.FrameDebugBuffer(width, height); } else { DebugBuffer = null; } }