private void PlatformCreateShaders() { GLDebug.CheckAccess(); var vertexShaderHandle = GL.CreateShader(ShaderType.VertexShader); var fragmentShaderHandle = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(vertexShaderHandle, vertexShaderSource); GL.ShaderSource(fragmentShaderHandle, fragmentShaderSource); GL.CompileShader(vertexShaderHandle); GL.CompileShader(fragmentShaderHandle); // Create program shaderProgramHandle = GL.CreateProgram(); GL.AttachShader(shaderProgramHandle, vertexShaderHandle); GL.AttachShader(shaderProgramHandle, fragmentShaderHandle); GL.BindAttribLocation(shaderProgramHandle, 0, "in_position"); GL.BindAttribLocation(shaderProgramHandle, 1, "in_color"); GL.BindAttribLocation(shaderProgramHandle, 2, "in_uv"); GL.LinkProgram(shaderProgramHandle); Debug.WriteLine(GL.GetProgramInfoLog(shaderProgramHandle)); GL.UseProgram(shaderProgramHandle); // Set uniforms transformLocation = GL.GetUniformLocation(shaderProgramHandle, "transform"); }
private void PlatformDispose() { GLDebug.CheckAccess(); GL.DeleteBuffer(vertexBufferId); GL.DeleteProgram(shaderProgramHandle); }
private Texture PlatformCreateTexture(TextureContent data) { GLDebug.CheckAccess(); var texture = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, texture); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, data.Pixels); return(new Texture(texture, data.Width, data.Height, data.Left, data.Right, data.Top, data.Bottom, data.IsTransparent)); }
private unsafe void PlatformDraw(Vertex *pVertex, ushort *pIndex, int vertexCount, int indexCount, int texture, bool isTransparent) { GLDebug.CheckAccess(); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertexCount * Vertex.SizeInBytes), (IntPtr)pVertex, BufferUsageHint.StaticDraw); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(indexCount * sizeof(ushort)), (IntPtr)pIndex, BufferUsageHint.StaticDraw); GL.BindTexture(TextureTarget.Texture2D, texture); if (isTransparent) { GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha); } else { GL.Disable(EnableCap.Blend); } GL.DrawElements(BeginMode.Triangles, indexCount, DrawElementsType.UnsignedShort, 0); }
private unsafe void PlatformBeginDraw(ref Matrix4x4 projection) { GLDebug.CheckAccess(); GL.UseProgram(shaderProgramHandle); GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferId); GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBufferId); GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, Vertex.SizeInBytes, 0); GL.VertexAttribPointer(1, 4, VertexAttribPointerType.UnsignedByte, true, Vertex.SizeInBytes, 8); GL.VertexAttribPointer(2, 2, VertexAttribPointerType.Float, false, Vertex.SizeInBytes, 8 + 4); GL.EnableVertexAttribArray(0); GL.EnableVertexAttribArray(1); GL.EnableVertexAttribArray(2); fixed(float *ptr = &projection.M11) { GL.UniformMatrix4(transformLocation, 1, false, ptr); } }
private void PlatformCreateBuffers() { GLDebug.CheckAccess(); vertexBufferId = GL.GenBuffer(); }