matio's picture

BeginMode.Quads renders a triangle

Hi, I've recently found this toolkit and have started off by trying to create a class that renders a Square:

using System;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
 
class Square {
	public int x, y, z, width, height;
 
	public Square (int _x, int _y, int _z=10, int _width=1, int _height=1) {
		x = _x;
		y = _y;
		z = _z;
		width = _width;
		height = _height;
	}
 
	public void Render () {
		GL.Begin (BeginMode.Quads);
			GL.Vertex3 (x, y, z);
			GL.Vertex3 (x+width, y, z);
			GL.Vertex3 (x, y+height, z);
			GL.Vertex3 (x+width, y+height, z);
		GL.End ();
	}
}
 
 
// Game.cs
// 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
 
    {
 
		private Square s;
 
        /// <summary>Creates a 800x600 window with the specified title.</summary>
 
        public Game()
 
            : base(800, 600, GraphicsMode.Default, "OpenTK Quick Start Sample")
 
        {
 
            VSync = VSyncMode.On;
 
			s = new Square (0,0);
 
        }
 
 
 
        /// <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);
 
        }
 
 
 
        /// <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);
 
 
 
            Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, Width / (float)Height, 1.0f, 64.0f);
 
            GL.MatrixMode(MatrixMode.Projection);
 
            GL.LoadMatrix(ref projection);
 
        }
 
 
 
        /// <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);
 
 
 
            Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
 
            GL.MatrixMode(MatrixMode.Modelview);
 
            GL.LoadMatrix(ref modelview);
 
 
 
            GL.Begin(BeginMode.Triangles);
 
 
 
//            GL.Color3(1.0f, 1.0f, 0.0f); GL.Vertex3(-1.0f, -1.0f, 4.0f);
 
//            GL.Color3(1.0f, 0.0f, 0.0f); GL.Vertex3(1.0f, -1.0f, 4.0f);
 
//            GL.Color3(0.2f, 0.9f, 1.0f); GL.Vertex3(0.0f, 1.0f, 4.0f);
 
			s.Render ();
 
 
 
            GL.End();
 
 
 
            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);
 
            }
 
        }
 
    }
 
}

Unfortunately when I run this it renders a triangle!

BTW: I've added this Square class to the QuickStart project.

Inline Images

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
Inertia's picture

Your GL.Vertex3 calls are out of order -> debug with pencil and paper.

tomster1996's picture

Try changing this:

public void Render () {
		GL.Begin (BeginMode.Quads);
			GL.Vertex3 (x, y, z);
			GL.Vertex3 (x+width, y, z);
			GL.Vertex3 (x, y+height, z);
			GL.Vertex3 (x+width, y+height, z);
		GL.End ();
}

to this

public void Render () {
		GL.Begin (BeginMode.Quads);
			GL.Vertex3 (x, y, z);
			GL.Vertex3 (x+width, y, z);
                        GL.Vertex3 (x+width, y+height, z);
			GL.Vertex3 (x, y+height, z);
 
		GL.End ();
}

Make sure youre coordinates go in a clockwise order.

matio's picture

That's worked! Thanks a lot!

Inertia's picture
c2woody's picture

Hehe :) Fully right.

tomster1996's picture

Looking back this, i gave him a fish for the day and taught him how to fish.

" Make sure youre coordinates go in a clockwise order. "

swiftcoder's picture

Perhaps worth pointing out that the original order would be correct for a counter-clockwise wound triangle strip.