Title: C OpenGL Tutorial
1C/OpenGL Tutorial
2OUTLINE
- C Tutorial
- CG Vocabulary
- OpenGL Tutorial
3C Tutorial
4Rule of thumb
- You dont have to try out everything just because
with C everything is possible
5OUTLINE C Tutorial
- Syntax differences on the low-level
- Constants
- Classes
- Pointers
- Memory management
- In/Output
- Using vectors and co.
- What is unique for Java?
- Useful links
6Syntax differences on the low-level ( 1 )
- The unsigned keyword
- unsigned int ranges in 0, max int
- Analogy for byte, short, long etc.
- Not boolean but bool
- This is valid
- a b 1
- Equivalent if statements
- if( number ! 0 )
- if( number )
7Syntax differences on the low-level ( 2 )
- Beware
- if( a b )
- instead
- Compiles unlike Java
- Arrays declaration
- int vertices 10
- Size fixed in declaration
- We can trick it anyway ?
8Syntax differences on the low-level ( 3 )
- Beware
- There are no IndexOutOfBoundsExceptions
- You have to check it yourself
- Or use stdvector or similar
- Prevents You from
- Accessing (read/write) not allocated memory
- Reading data from any location
- Undesired application crash
9Constants and macros
- Defining a constant
- define MAX_SIZE 10
- Usually without semicolon!
- define MAX_SIZE 10
- means MAX_SIZE is 10
- After text replacement
mysize factor MAX_SIZE asize
mysize factor 10 asize
10Classes ( 1 )
- A class structure (in a header file ex. pair.h)
- An example class
-
- class Pair
- public
- Pair ( ) // The default constructor
- Pair ( int x, int y ) // The constructor
- Pair ( ) // The destructor
- int getX ( )
- int getY ( )
- void setX ( int newValue )
- void setY ( int newValue )
- private
- int x
- int y
-
11Classes ( 2 )
- Function declaration in the .h (header) file
- Function definition in the .cpp file
- include pair.h
- Example function definition
-
void PairsetX( int _x ) x _x
12Classes ( 3 )
- Q How to avoid cyclic includes?
- A Compiler directives.
- Ex. define, ifdef, ifndef, else, elseif,
endif - Example code
-
ifndef _PAIR_H define _PAIR_H_ class Pair
endif
13Classes inheritance
- Dynamical binding not by default in C
- virtual keyword necessary (example)
class Secretary Employee //Secretary extends
Employee public Secretary( int id ) virtual
void work( ) private void write( ) int
identity
- SecretarySecretary( int id ) Employee( id ),
identity( id ) -
- void Secretarywork( )
- Employeework( )
- write( )
14Pointers ( 1 )
- Variable containing an address to another
variable - 310 char achar array
- 410 double pi 3.14
- 411 long flag 0
- 412 char pchar achar
- 510 char pstr string
- 610 long pli flag
15Pointers ( 2 )
- Example
-
- Prints
- i 42 intptr 42
-
int intptr int i 13, j 29 intptr i
// address operator intptr j //
dereference operator stdcout ltlt i ltlt
i stdcout ltlt intptr ltlt intptr ltlt stdendl
16Pointers ( 3 )
- Dereferencing objects example
- Special operator -gt
- b-gtdie( ) is equivalent to ( b ).die( )
- b is the value, the bambus and die( ) its
member
- BambusTree b new BambusTree( )
- BambusTree btree
- b-gtgrow( 20.0f ) // dereferencing
- b-gtdie( )
- btree.grow( 20.0f )
- btree.die( )
17Pointers ( 4 )
- Call by value
- Parameter passing of a function
- Call by reference
- Passing an address as a parameter
- Changes the functions arguments outside the
function - Example
//function add add(int a, int b, int sum)sum
ab int summand1 2, summand2 3 int
result add( summand1, summand2, result )
18Memory management ( 1 )
- After creating a new object, we have ALLOCATED
memory which WE must FREE - All pointers set with new must be set free
- For each new we must provide a delete
- Example (static destructor for simple objects)
BambusTree b new BambusTree( ) delete b
//calls a destructor of the class BambusTree b
null
19Memory management ( 2 )
- Arrays are also pointers, freeing memory
necessary too - Example (dynamic destructor for arrays)
- Use memory leak checkers
int riceField riceField new int 12
delete riceField riceField null
20In/Output ( 1 )
- Reading from a file
- We include ltiostreamgt, ltfstreamgt, ltstringgt
- Setup declare/define the necessary
-
- Reading itself
-
stdstring filename name // name is a
parameter stdifstream in_str( filename.c_str(),
stdifstreamin ) stdstring currentLine
stdgetline( ( in_str ), currentLine ) // the
whole line is as a string in currentLine
21In/Output ( 2 )
- Reading from a file ( 2 )
- String handling examples
- Erasing
- currentLine.erase( 0, 3 )
- Getting ints and floats
- int index float u float v
- sscanf_s( currentLine.c_str( ), "d f f,
index, u, v ) - // currentLine expected to be ex. 1 0.567 0.789
- Accessing a single character
-
currentLine.erase( 0, 3 )
int index float u float v sscanf_s(currentLine.
c_str(),"d f f,index,u,v) // currentLine
expected to be ex. 1 0.567 0.789
switch( currentLine 0 ) case '' case
'?'
22In/Output ( 3 )
- Reading from a file ( 3 )
- Closing the input stream
- in_str.close( )
- Useful print a float/int variable to a buffer
- char buffer 64
- float radius 5
- float perimeter 31.4159f
- sprintf_s( buffer, "d f", radius, perimeter )
// 5 31.4159 - Writing to a command line
in_str.close( )
char buffer 64 float radius 5 float
perimeter 31.4159f sprintf_s( buffer, "d
f", radius, perimeter ) // 5 31.4159
stdcout ltlt radius ltlt ltlt perimeter ltlt
stdendl stdcerr ltlt ERROR OCCURED ltlt
stdendl stdcin.get() // wait until key
pressed, then close exit( 1 )
23Using stdvector ( 1 )
- C brother of Java-vector class
- Grows dynamically
- definition
- stdvectorlt Bambus gt bv
- An empty vector of elements type Bambus
- stdvectorlt Bambus gt bv( 100 )
- A Bambus-vector with 100 elements
- Default constructor necessary
24Using stdvector ( 2 )
- bv a vectorlt Bambus gt, b Bambus
- clear( ) resize(100) push_back( b) pop_back(
) - Accessing elements
- Many other useful functions
for( int i 0 i lt bv.size() i ) //bv i
25Features unique for java
- Thread handling is easy
- synchronized keyword
- instanceof operator
- Interfaces
- Java is interpreted!
26Useful links
- Online reference
- http//www.cplusplus.com/
- MS Development Network
- www.msdn.com
- Moving from java to C
- http//www.horstmann.com/ccj2/ccjapp3.html
- http//www-ali.cs.umass.edu/mckinley/377/labs/c
_for_java_programmers.html - C Kurs
- http//www.mathematik.uni-marburg.de/cpp/
27OpenGL Tutorial
28CG Vocabulary
- Fixed function pipeline
- Programmable pipeline
- LightNing vs. Lighting
- Gouraud shading
- QuaterNion vs. Quaterion
29OpenGL Tutorial - Outline
- How to get OpenGL
- Setup project
- Concepts (state machine, stacks)
- Viewing pipeline
- Textures
- Lighting
- Render with immediate mode
- Create window, context with Glut
- Input handling with Glut
30How to get OpenGL
- API standard maintained by Khronos group
- Implemented by graphics card vendors
- Current OpenGL version v2.1
- Windows includes only v1.1
- Get somewhere else (Cg Toolkit 1)
- Resources at 2
31Setup project
- Include files
- Link libraries
- opengl32.lib
- glu32.lib
include ltGL/gl.hgt //basic OpenGL include
ltGL/glu.hgt //OpenGL utility functions
32Concepts 1/2 - State machine
- OpenGL command syntax
- Certain amount of states are present
- states set to certain mode, active until change
- On/Off states (eg. backface culling)
- Variable states (eg. current color)
- Call to get value of states
glCommand1234sifd(Type x1, Type x2,
...) GL_CONSTANT //syntax for OpenGL constants
glGet() //several calls beginning with get
33Concepts 2/2 - Stacks
- Stacks for different sets of variables
- Attribute stack
- All states can be saved
glPushAttrib() //saves the current attribs on
stack glPopAttrib() //restores last saved attribs
- Matrix stack
- GL_PROJECTION
- GL_MODELVIEW
- GL_TEXTURE
glMatrixMode(GL_MODE) //sets the matrix
mode glPushMatrix() //saves the matrix on
stack glPopMatrix() //restores the last saved
matrix
34Viewing pipeline 1/4
- Modifications of matrices
- Translation
- Scale
- Rotation
- Calls always multiply the current active matrix
glTranslatefd(TYPE x, TYPE y, TYPE z)
glScalefd(TYPE x, TYPE y, TYPE z)
glRotatefd(TYPE angle, TYPE x, TYPE y, TYPE z)
35Viewing pipeline 2/4
- Perspective projection via GL_PROJECTION matrix
mode - Build projection out of camera parameters
- Important!
- Clear the matrix before changing
glFrustum(l, r, b, t, n, f) //perspective
projection glOrtho(l, r, b, t, n,
f) //orthographic projection
gluPerspective(fov, aspect, near, far)
glLoadIdentity()
36Viewing pipeline 3/4
- Model and view matrix via GL_MODELVIEW
- Must be rebuilt when camera position changes
gluLookAt(eyex, eyey, eyez, centerx, centery,
centerz, upx, upy, upz)
//camera changes glLoadIdentity() gluLookAt( ...
) //creates view matrix //render Models foreach
object glPushMatrix() //store on Matrix
stack transform and render model //modelview
created glPopMatrix() //recover view matrix
37Viewing pipeline 4/4
- Advanced methods
- Generate one yourself
- Multiply by current matrix
glMatrixMode(GL_MODE) float myMatrix new
float16 //generate the matrix you
want glLoadMatrixf(myMatrix) //replaces current
matrix //with given
glMatrixMode(GL_MODE) float myMatrix new
float16 //generate the matrix you
want glMultMatrixf(myMatrix) //multiplies
current matrix //with given
38Textures 1/4
- Texture activation
- Have to be enabled
- Unique handle for each texture
- Bind active texture
- Must be done every frame for every texture that
is needed
glEnable(GL_TEXTURE_2D)
int myHandle glGenTextures(1, myHandle) //gener
ates handle for 1
glBindTexture(GL_TEXTURE_2D, myHandle)
39Textures 2/4
- Texture initialisation
- Load texture data into GPU memory
- Alternative build all mipmaps
enable and activate current texture int mipLevel
0 int border 0 int internalFormat
GL_RGBA, int width 800 int height 600 int
format GL_RGBA int type GL_UNSIGNED_BYTE cha
r data new charwidth height 4 //fill
data with values glTexImage(GL_TEXTURE_2D,
mipLevel, internalFormat, width, height, border,
format, type, data)
gluBuild2DMipmaps(GL_TEXTURE_2D, internalFormat,
width, height, border, format, type, data)
40Textures 3/4
- Texture environments
- State call
- Filtering types (pname)
- Filtering method (param)
glTexParameteri(GL_TEXTURE_2D, pname, param)
GL_TEXTURE_MIN_FILTER //minification
filter GL_TEXTURE_MAG_FILTER //maxification
filter
GL_NEAREST //nearest neighbour GL_LINEAR //li
near GL_NEAREST_MIPMAP_NEAREST //nn with
mipmaps GL_LINEAR_MIPMAP_LINEAR //linear with
mipmaps
41Textures 4/4
- Texture environments
- Repetition type (pname)
- Repetition method (param)
GL_TEXTURE_WRAP_S //in s direction GL_TEXTURE_WRA
P_T //in t direction
GL_CLAMP_TO_EDGE GL_REPEAT
42Lighting 1/2
- Lighting activation
- Set shading
- GL_FLAT
- GL_SMOOTH
- Enable Lighting
- Enable Light
- 8 lights supported
glShadeModel(GL_MODE)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
43Lighting 2/2
- Lighting setup
- State call
- Light characteristic (pname)
- Characteristic value (param)
- Usually float4
glLightfv(GL_LIGHTi, pname, param)
GL_AMBIENT //params needed for diffuse
lighting GL_DIFFUSE //more are available GL_SPECUL
AR GL_POSITION
44Render with immediate mode
- Transfer each single vertex into GPU memory
- Different primitives
- Render primitive(s)
glTexCoord2f(u, v) //optional texcoord for
vertex glNormal3f(nx, ny, nz)//optional normal
for vertex glVertex3f(x, y, z)
GL_POINTS GL_LINES, GL_LINE_STRIP,
GL_LINE_LOOP GL_TRIANGLES, GL_TRIANGLE_STRIP,
GL_TRIANGLE_FAN GL_QUADS, GL_QUAD_STRIP,
GL_POLYGON
glBegin(GL_PRIMITIVE) calls for
vertices glEnd()
45Create window, context with Glut 1/4
- Glut OpenGL Utility Toolkit 3 4
- Platform independent window and input handling
- Link Library
- glut32.lib
include ltGL/glut.hgt //must be first gl related
include do other opengl includes
46Create window, context with Glut 2/4
- Init Glut
- Create window
- windowed
- full screen
- Game mode string
- pxwidth x pxheight depth _at_ refresh rate
glutInit(argc, argv) glutInitDisplayMode(GLUT_RG
BAGLUT_DOUBLEGLUT_DEPTH)
glutInitWindowPosition(50, 50) glutInitWindowSize
(width, height) glutCreateWindow(Windowtitle)
glutGameModeString(1024x76832_at_60) glutEnterGam
eMode()
47Create window, context with Glut 3/4
glViewPort(0, 0, pxwidth, pxheight) glEnable(GL_
DEPTH_TEST) glDepthFunc(GL_LEQUAL) glClearDepth(
1.0f) glEnable(GL_CULL_FACE) glClearColor(0.0f
, 0.0f, 0.0f, 0.0f) //some other things done
here too, //but only in advanced OpenGL //see the
first repetitorium
48Create window, context with Glut 4/4
- Callbacks have to be set to user defined
functions - Rendering and idle
void myRenderScene() glClear(GL_COLOR_BUFFER_BIT
GL_DEPTH_BUFFER_BIT) update an render
scene glutSwapBuffers() int main(int argc,
char argv) init glut init opengl other glut
callbacks glutDisplayFunc(myRenderScene) //set
callback glutIdleFunc(myRenderScene) //set
callback glutMainLoop() //starts the mainloop
49Input handling with Glut 1/2
- Set callbacks
- Key down / up
float moveway 0.0f void myKeyboardFunc(int
key, int x, int y) if (key a) moveway
1.0f void myKeyboardUpFunc(int key, int x, int
y) if (key a) moveway
0.0f glutIgnoreKeyRepeat(1) //ignore
keyrepeat glutKeyboardFunc(myKeyboardFunc) glutKe
yboardUpFunc(myKeyboardUpFunc)
50Input handling with Glut 2/2
- Set callback
- Mouse move / click
void myMouseMoveFunc(int x, int y) process
mousecoordinates void myMouseFunc(int button,
int state, int x, int y) process
buttons glutPassiveMotionFunc(myMouseMoveFunc)
glutMouseFunc(myMouseFunc)
51References
- 1 nVidia Cg Toolkit http//developer.nvidia.com/
object/cg_toolkit.html - 2 OpenGLhttp//www.opengl.org
- 3 Gluthttp//www.xmission.com/nate/glut.html
- 4 Lighthouse3Dhttp//www.lighthouse3d.com/openg
l/glut/