Simple OpenTK program not working

Started by
2 comments, last by Krum110487 11 years, 8 months ago
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]
Toughts, creations and ramblings can be found at: http://richy1913.byethost22.com/
Advertisement
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);

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
Toughts, creations and ramblings can be found at: http://richy1913.byethost22.com/
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.

This topic is closed to new replies.

Advertisement