protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); // set up viewport GL.Viewport(0, 0, Size.X, Size.Y); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // determinate object view rotation vectors and apply them _objectView = _baseView; var rotation = _rotateVectors[_rotateIndex]; if (rotation != Vector3.Zero) { _objectView *= Matrix4.CreateFromAxisAngle(_rotateVectors[_rotateIndex], (float)(_stopwatch.Elapsed.TotalSeconds * 1.0)); } // set transformation matrix _textureProgram.Use(); _textureProgram.ModelViewProjectionMatrix.Set(_objectView * ActiveCamera.ViewProjectionMatrix); _cube.Draw(); // swap buffers SwapBuffers(); }
protected override void OnRenderFrame(FrameEventArgs e) { // set up viewport GL.Viewport(0, 0, Size.X, Size.Y); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); SetupPerspective(); // determinate object view rotation vectors and apply them _objectView = _baseView; var rotation = _rotateVectors[_rotateIndex]; if (rotation != Vector3.Zero) { _objectView *= Matrix4.CreateFromAxisAngle(_rotateVectors[_rotateIndex], (float)(_stopwatch.Elapsed.TotalSeconds * 1.0)); } // set transformation matrix _textureProgram.Use(); _textureProgram.ModelViewProjectionMatrix.Set(_objectView * ModelView * Projection); // render cube with texture _cubeVao.Bind(); _cubeVao.DrawArrays(_cube.DefaultMode, 0, _cube.VertexBuffer.ElementCount); // swap buffers SwapBuffers(); }
protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); // set up render to texture _framebuffer.Bind(FramebufferTarget.Framebuffer); GL.Viewport(0, 0, FramebufferWidth, FramebufferHeight); GL.ClearColor(Color.Black); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // render rotating cube to texture _colorProgram.Use(); _colorProgram.ModelViewProjectionMatrix.Set( Matrix4.CreateRotationX((float)FrameTimer.TimeRunning / 1000) * Matrix4.CreateRotationY((float)FrameTimer.TimeRunning / 1000) * Matrix4.CreateTranslation(0, 0, -5) * Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, FramebufferWidth / (float)FramebufferHeight, 0.1f, 100)); _cube.Draw(); // reset to default framebuffer Framebuffer.Unbind(FramebufferTarget.Framebuffer); // set up viewport for the window GL.Viewport(0, 0, Size.X, Size.Y); GL.ClearColor(Color.MidnightBlue); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // render quad with texture _textureProgram.Use(); _textureProgram.ModelViewProjectionMatrix.Set(ActiveCamera.ViewProjectionMatrix); _quad.Draw(); // swap buffers SwapBuffers(); }
private void OnRenderFrame(object sender, FrameEventArgs e) { // set up render to texture _framebuffer.Bind(FramebufferTarget.Framebuffer); GL.Viewport(0, 0, FramebufferWidth, FramebufferHeight); GL.ClearColor(Color.Black); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // render rotating cube to texture _colorProgram.Use(); _colorProgram.ModelViewProjectionMatrix.Set( Matrix4.CreateRotationX((float)FrameTimer.TimeRunning / 1000) * Matrix4.CreateRotationY((float)FrameTimer.TimeRunning / 1000) * Matrix4.CreateTranslation(0, 0, -5) * Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, FramebufferWidth / (float)FramebufferHeight, 0.1f, 100)); _cubeVao.Bind(); _cubeVao.DrawElements(PrimitiveType.Triangles, _cube.IndexBuffer.ElementCount); // reset to default framebuffer Framebuffer.Unbind(FramebufferTarget.Framebuffer); // set up viewport for the window GL.Viewport(0, 0, Width, Height); GL.ClearColor(Color.MidnightBlue); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); SetupPerspective(); // render quad with texture _textureProgram.Use(); _textureProgram.ModelViewProjectionMatrix.Set(ModelView * Projection); _quadVao.Bind(); _quadVao.DrawArrays(PrimitiveType.TriangleStrip, 0, _quad.VertexBuffer.ElementCount); // swap buffers SwapBuffers(); }
private void OnLoad(object sender, EventArgs e) { // load texture from file using (var bitmap = new Bitmap("Data/Textures/checker.jpg")) { BitmapTexture.CreateCompatible(bitmap, out _texture); _texture.LoadBitmap(bitmap); } _texture.GenerateMipMaps(); // initialize sampler _sampler = new Sampler(); _sampler.SetWrapMode(TextureWrapMode.Repeat); // create vertex data for a big plane const int a = 10; const int b = 10; var vertices = new[] { new Vertex(-a, 0, -a, 0, 0), new Vertex(a, 0, -a, b, 0), new Vertex(-a, 0, a, 0, b), new Vertex(a, 0, a, b, b) }; // create buffer object and upload vertex data _vbo = new Buffer <Vertex>(); _vbo.Init(BufferTarget.ArrayBuffer, vertices); // initialize shader _program = ProgramFactory.Create <SimpleTextureProgram>(); // activate shader program _program.Use(); // bind sampler _sampler.Bind(TextureUnit.Texture0); // bind texture _program.Texture.BindTexture(TextureUnit.Texture0, _texture); // which is equivalent to //_program.Texture.Set(TextureUnit.Texture0); //_texture.Bind(TextureUnit.Texture0); // set up vertex array and attributes _vao = new VertexArray(); _vao.Bind(); // memory layout of our data is XYZUVXYZUV... // the buffer abstraction knows the total size of one "pack" of vertex data // and if a vertex attribute is bound without further arguments the first N elements are taken from each pack // where N is provided via the VertexAttribAttribute on the program property: _vao.BindAttribute(_program.InPosition, _vbo); // if data should not be taken from the start of each pack, the offset must be given in bytes // to reach the texture coordinates UV the XYZ coordinates must be skipped, that is 3 floats, i.e. an offset of 12 bytes is needed _vao.BindAttribute(_program.InTexCoord, _vbo, 12); // if needed all the available arguments can be specified manually, e.g. //_vao.BindAttribute(_program.InTexCoord, _vbo, 2, VertexAttribPointerType.Float, Marshal.SizeOf(typeof(Vertex)), 12, false); // set default camera Camera.DefaultState.Position = new Vector3(0, 0.5f, 3); Camera.ResetToDefault(); // set a nice clear color GL.ClearColor(Color.MidnightBlue); }