I was trying to port some of my old OpenGL stuff to OpenTK however I couldnt get it to work.
I am now trying a simple program to display a triangle:
This is my setup:
MVP = Matrix4.CreateOrthographicOffCenter(0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f);
where the screen is:
[source lang="plain"]0 - 0 1 - 0---------------------------------------------| || || || || |---------------------------------------------0 - 1 1 - 1[/source]
And these verticies:
[source lang="csharp"]float[] vertices = { 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };[/source]
The triangle should be right in the midle of the screen, well for some reason it isnt.
Heres all the code encase its something other than positioning
[source lang="csharp"]// Released to the public domain. Use, modify and relicense at will.using System;using OpenTK;using OpenTK.Graphics;using OpenTK.Graphics.OpenGL;using OpenTK.Audio;using OpenTK.Audio.OpenAL;using OpenTK.Input;namespace StarterKit{class Game : GameWindow{ float[] vertices = { 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }; int vbo; string fragmentSource = "#version 120\n" + "void main(){gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);}"; string vertexSource = "#version 120 \n" + "uniform mat4 MVP; attribute vec4 Position;" + "void main(){ gl_Position = MVP * Position; }"; int shaderProgram, vertexShader, fragmentShader; int MVPID, PositionID; Matrix4 MVP; /// <summary>Creates a 800x600 window with the specified title.</summary> public Game () : base(800, 600, GraphicsMode.Default, "OpenTK Quick Start Sample") { VSync = VSyncMode.On; } protected override void OnDisposed(EventArgs e) { GL.DetachShader( shaderProgram, vertexShader ); GL.DetachShader( shaderProgram, fragmentShader ); GL.DeleteShader(vertexShader); GL.DeleteShader(fragmentShader); GL.DeleteProgram(shaderProgram); GL.DeleteBuffers(1, ref vbo); base.OnDisposed(e); } /// <summary>Load resources here.</summary> /// <param name="e">Not used.</param> protected override void OnLoad (EventArgs e) { base.OnLoad (e); GL.ClearColor (0.1f, 0.2f, 0.5f, 0.0f); GL.Enable (EnableCap.DepthTest); GL.GenBuffers (1, out vbo); GL.BindBuffer (BufferTarget.ArrayBuffer, vbo); GL.BufferData (BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StaticDraw); vertexShader = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource( vertexShader, vertexSource ); GL.CompileShader( vertexShader ); fragmentShader = GL.CreateShader( ShaderType.FragmentShader ); GL.ShaderSource( fragmentShader, fragmentSource ); GL.CompileShader( fragmentShader ); shaderProgram = GL.CreateProgram(); GL.AttachShader( shaderProgram, vertexShader ); GL.AttachShader( shaderProgram, fragmentShader ); GL.LinkProgram(shaderProgram); MVPID = GL.GetUniformLocation(shaderProgram, "MVP"); PositionID = GL.GetAttribLocation(shaderProgram, "Position"); MVP = Matrix4.CreateOrthographicOffCenter(0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 2.0f); } /// <summary> /// Called when your window is resized. Set your viewport here. It is also /// a good place to set up your projection matrix (which probably changes /// along when the aspect ratio of your window). /// </summary> /// <param name="e">Not used.</param> protected override void OnResize (EventArgs e) { base.OnResize (e); GL.Viewport (ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height); } /// <summary> /// Called when it is time to setup the next frame. Add you game logic here. /// </summary> /// <param name="e">Contains timing information for framerate independent logic.</param> protected override void OnUpdateFrame (FrameEventArgs e) { base.OnUpdateFrame (e); if (Keyboard [Key.Escape]) Exit (); } /// <summary> /// Called when it is time to render the next frame. Add your rendering code here. /// </summary> /// <param name="e">Contains timing information.</param> protected override void OnRenderFrame (FrameEventArgs e) { base.OnRenderFrame (e); GL.Clear (ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.UseProgram (shaderProgram); GL.UniformMatrix4(MVPID, false, ref MVP); GL.EnableVertexAttribArray(PositionID); GL.BindBuffer(BufferTarget.ArrayBuffer, vbo); GL.VertexAttribPointer(PositionID, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); GL.DrawArrays(BeginMode.Triangles, 0, 3); GL.DisableVertexAttribArray(PositionID); GL.UseProgram (0); SwapBuffers (); } /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main () { // The 'using' idiom guarantees proper resource cleanup. // We request 30 UpdateFrame events per second, and unlimited // RenderFrame events (as fast as the computer can handle). using (Game game = new Game()) { game.Run (30.0); } }}}[/source]
3 replies to this topic
#1 Members - Reputation: 115
Posted 17 August 2012 - 05:22 PM
Toughts, creations and ramblings can be found at: http://richy1913.byethost22.com/
Sponsor:
#3 Members - Reputation: 115
Posted 18 August 2012 - 05:03 PM
I could be wrong, but you might have your near a bit off on the orthographicOffCenter, try:
CreateOrthographicOffCenter(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 2.0f);
It ended up being the z distance thanks.
I dont really understand tho, say I put 0 and -2 as the near and far distance. Am I correct to assume that anything with a Z value between these will be displayed?
Let me rephrase the question, is the zFar value a point in 3d space (making my logic valid) or is it a length in the negative direction from the zNear value(which is what it seems to be)?
by the second explanation I mean for example using -1 and 3 would make anything visible between -1 and -4
Edited by richy19, 18 August 2012 - 05:07 PM.
Toughts, creations and ramblings can be found at: http://richy1913.byethost22.com/
#4 Members - Reputation: 110
Posted 18 August 2012 - 06:38 PM
the near and far (to my understanding) is how many units towards(near) and away(far) from the camera.
so -1 would be (origin - 1) (towards) and 2 would be (origin + 2) (away), so anything will render in the range of -1 to 0 or 0 to 2
so anything lower than -1 or higher than 2 wouldn't show, and it may or may not include 2 and -1 as not rendering, I am unsure, I just noticed you were cutting it close, it is always a good idea to play it safe and have some padding.
although I am new, so if you want a more detailed explanation, you might wait for someone else.
so -1 would be (origin - 1) (towards) and 2 would be (origin + 2) (away), so anything will render in the range of -1 to 0 or 0 to 2
so anything lower than -1 or higher than 2 wouldn't show, and it may or may not include 2 and -1 as not rendering, I am unsure, I just noticed you were cutting it close, it is always a good idea to play it safe and have some padding.
although I am new, so if you want a more detailed explanation, you might wait for someone else.
Edited by Krum110487, 18 August 2012 - 06:39 PM.






