OpenGL - 3D
Koden er gjengitt i sin helhet nedenfor. Du ser at det er satt op Callback funksjoner som tar seg av brukerinitierte begiveheter og en timer. Siden 3D-grafikk ikke er noe sentralt tema i dette materialet, går vi ikke nærmere inn på detaljer.
Prosjektet forutesetter TAO Framework [2] installert i Program Files på din maskin. Du kan selvsagt installere hvor du vil, og endre references i prosjektet.
using System;
using System.Collections.Generic;
using System.Text;
using Tao.FreeGlut;
using Tao.OpenGl;
namespace glut1
{
class Program
{
static float rotx;
static float rotz;
static void Main(string[] args)
{
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_SINGLE);
Glut.glutInitWindowSize(320, 320);
Glut.glutInitWindowPosition(50, 50);
Glut.glutCreateWindow("Teapot");
// once in a lifetime
Init();
// define callbacks
Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
Glut.glutTimerFunc(100, new Glut.TimerCallback(Timer), 7);
// start the glut main loop
Glut.glutMainLoop();
}
private static void Init(){
// set up material
float[] mat_ambient ={ 0.3f, 0.3f, 0.0f, 1.0f };
float[] mat_diffuse ={ 1.0f, 1.0f, 0.5f, 1.0f };
float[] spec={0.6f,0.6f,0.5f,1.0f};
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT, mat_ambient);
Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_DIFFUSE, mat_diffuse);
// set up light
float[] ambient = { 0.2f, 0.2f, 0.2f, 1.0f };
float[] diffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
float[] position = { 200.0f, 300.0f, 100.0f, 0.0f };
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambient);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuse);
Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position);
Gl.glEnable(Gl.GL_LIGHT0);
Gl.glEnable(Gl.GL_LIGHTING);
// enable light
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_LIGHT0);
// depth sorting
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glDepthFunc(Gl.GL_LESS);
// background
Gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
#region callbacks
// callbacks
private static void Timer(int t)
{
rotx += 1.0f;
rotz += 1.0f;
Display();
Glut.glutTimerFunc(50, new Glut.TimerCallback(Timer), 7);
}
private static void Display()
{
Gl.glClear( Gl.GL_COLOR_BUFFER_BIT |
Gl.GL_DEPTH_BUFFER_BIT |
Gl.GL_ACCUM_BUFFER_BIT);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Glu.gluLookAt(0, 0, 5, // eyepos
0, 0, 0, // look at
0, 1, 0);// up-vector
Gl.glRotatef(rotx, 1.0f, 0.0f, 0.0f);
Gl.glRotatef(rotz, 0.0f, 0.0f, 1.0f);
Glut.glutSolidTeapot(0.9f);
Gl.glFlush();
Glut.glutSwapBuffers();
}
private static void Reshape(int width, int height)
{
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glViewport(0, 0, width, height);
Glu.gluPerspective(30.0f, (double)width/height, 0.1f, 70.0f);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
}
#endregion callbacks
}
}



