protected int LoadTexture(Bitmap data, TextureWrapMode mode) { BitmapData lockedBitmap = data.LockBits(new Rectangle(Point.Empty, data.Size), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); byte[] buffer = new byte[lockedBitmap.Width * lockedBitmap.Height * 4]; for (int i = 0; i < buffer.Length; i += 4) { byte r, g, b, a; a = Marshal.ReadByte(lockedBitmap.Scan0 + i); r = Marshal.ReadByte(lockedBitmap.Scan0 + i + 1); g = Marshal.ReadByte(lockedBitmap.Scan0 + i + 2); b = Marshal.ReadByte(lockedBitmap.Scan0 + i + 3); buffer[i] = r; buffer[i + 1] = g; buffer[i + 2] = b; buffer[i + 3] = a; } data.UnlockBits(lockedBitmap); CheckGlErrors("pre-texture-gen"); int textureId = Gl.GenTexture(); Gl.ActiveTexture(TextureUnit.Texture0); Gl.BindTexture(TextureTarget.Texture2D, textureId); Gl.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); Gl.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); Gl.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)mode); Gl.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)mode); CheckGlErrors("pre-texture-upload"); Gl.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, data.Width, data.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, buffer); CheckGlErrors("post-texture-upload"); if (mode == TextureWrapMode.ClampToBorder) { float[] borderColor = new float[] { 0xff, 0x14, 0x93 }; Gl.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, borderColor); } CheckGlErrors("ok-texture-gen"); return(textureId); }
protected override void Renderer_ContextCreated(RenderThread sender, ContextCreationEventArgs args) { Log.WriteLine("Render context created. Continuing initialization..."); Log.WriteLine("Running on OpenGL: %@", LogLevel.Message, Gl.GetString(StringName.Renderer) + Gl.GetString(StringName.Version)); Renderer.TargetWindow.KeyDown += TargetWindow_KeyDown; Renderer.TargetWindow.KeyUp += TargetWindow_KeyUp; CompileShaders(); LoadTextures(); Gl.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); VAO = Gl.GenVertexArray(); Gl.BindVertexArray(VAO); CheckGlErrors("pre-texture"); Gl.ActiveTexture(TextureUnit.Texture0); Gl.BindTexture(TextureTarget.Texture2D, fontAtlasTexture); CheckGlErrors("post-texture"); VBO = Gl.GenBuffer(); Gl.BindBuffer(BufferTarget.ArrayBuffer, VBO); EBO = Gl.GenBuffer(); Gl.BindBuffer(BufferTarget.ElementArrayBuffer, EBO); CheckGlErrors("pre_va_pointer"); Gl.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 12 * sizeof(float), 0 * sizeof(float)); CheckGlErrors("post-va-pointer-0-set"); Gl.EnableVertexAttribArray(0); CheckGlErrors("post-va-pointer-0-enable"); Gl.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 12 * sizeof(float), 2 * sizeof(float)); Gl.EnableVertexAttribArray(1); CheckGlErrors("post-va-pointer-1"); Gl.VertexAttribPointer(2, 4, VertexAttribPointerType.Float, false, 12 * sizeof(float), 4 * sizeof(float)); Gl.EnableVertexAttribArray(2); CheckGlErrors("post-va-pointer-2"); Gl.VertexAttribPointer(3, 4, VertexAttribPointerType.Float, false, 12 * sizeof(float), 8 * sizeof(float)); Gl.EnableVertexAttribArray(3); }