Grafikprogrammierung in c++ mit OpenGL

Installation

Unter Linux ist die Installation ziemlich einfach.
Zumindest wenn man zuvor schon den zur Grafikkarte passenden Treiber installiert hat (und eventuell auch noch CUDA).

OpenSuse 15.1:

sudo apt-get install freeglut-devel
sudo apt-get install libSDL_image-devel

Damit sollten auch einige abhängige Pakete mitinstalliert werden.

Ubuntu:

sudo apt-get install freeglut3-dev
sudo apt-get install libsdl_image1.2-dev

Auch hier sollten einige abhängige Pakete mitinstalliert werden.

Installation unter Windows

Jetzt habe ich ein anderes Tutorial gefunden (November 2020), mit dem es funktioniert:
"C++ OpenGL Tutorial [Deutsch]" von Pilzschaf bei YouTube zu finden.

Das selbe Beispiel (bisher nach Folge #007) funktioniert auch unter Linux.
Wenn als Texteditor der Emacs verwendet wird ist die Einrichtung sehr viel einfacher:
Diese beiden Pakete installieren: libsdl2-dev, libglew-dev
Ein Ordner anlegen mit Projektname. Da hinein das main.cpp kopieren. Und folgendes makefile (Textdatei "makefile" ohne .txt) erstellen:

CC=gcc
CXX=g++
WARN = -Wall -Wno-unused-variable
#DEBUG= -ggdb  # fuer den Gnu-Debugger
OPT  = -O3  #-O3 fuer moeglichst schnell, -Os fuer moeglist kurz
CFLAGS  =  -std=c++11 $(WARN) $(OPT) $(DEBUG) 
CXXFLAGS= $(CFLAGS)
LDFLAGS = $(DEBUG)
LDLIBS  = -lGL -lSDL2 -lGLEW -lm

all: main

clean:
	rm -f *.o *~
clean_all:
	rm -f *.o *~ main
Wobei hier jetzt noch kein GLUT verwendet wird.
(bisher nur mit Ubuntu 20.04.1 LTS ausprobiert)

Erste Beispiele

Hier mal ein erstes Beispiel, das nur ein leeres Fenster öffnet.
Tönt banal, aber damit kann man schon mal testen ob die grundlegendsten Dinge funktionieren.
Das ist alles sozusagen das Helloworld-Programm für OpenGL:
// hello.cc
#include <stdio.h>
#include <GL/freeglut.h>
typedef unsigned char uchar;

void display()
{
 glClearColor(0.0, 0.0, 0.0, 0.0);
 glClear(GL_COLOR_BUFFER_BIT);

 glFlush();
}

void reshape(int w,int h)
{
 printf("reshape(%d,%d)\n",w,h);//test
 glutPostRedisplay();
}

void key(uchar c,int x,int y) //Tastatur abfragen
{
 printf("key(c=%d,x=%d,y=%d)\n",c,x,y);//test
 glutPostRedisplay();
}
void spezial(int key,int x,int y) //Tastatur spezialzeichen
{
 printf("spezial(key=%d,x=%d,y=%d)\n",key,x,y);//test
 glutPostRedisplay();
}

void mausknopf(int button,int state,int x,int y)
{
 printf("mausknopf(button=%d,state=%d,%d,%d)\n",button,state,x,y);//test
 glutPostRedisplay();
}

void mausmotion(int x,int y) //Mausbewegung mit gedrueckter Taste
{
 printf("mausmotion(%d,%d)\n",x,y);//test
 glutPostRedisplay();
}
void mausmotion2(int x,int y) //Mausbewegung ohne Taste zu druecken
{
 printf("mausmotion2(%d,%d)\n",x,y);//test
 glutPostRedisplay();
}

void idle() {glutPostRedisplay();}

int main(int argc,char** argv)
{
 glutInit(&argc,argv);
 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
 glutInitWindowSize(500,500);
 glutInitWindowPosition(100,50);
 glutCreateWindow("Leeres Fenster");
 //glutIdleFunc(idle);
 glutDisplayFunc(display);
 glutReshapeFunc(reshape);
 glutKeyboardFunc(key);
 glutSpecialFunc(spezial);
 glutMouseFunc(mausknopf);
 glutMotionFunc(mausmotion);
 glutPassiveMotionFunc(mausmotion2);
 // zum Loslassen von Tasten:
 //glutKeyboardUpFunc(void (*func)(unsigned char key,int x,int y));
 //glutSpecialUpFunc(void (*func)(int key,int x, int y));
 glutMainLoop();
 return 0;
}
Compilieren sollte so gehen:
c++ hello.cc -lGL -lGLU -lglut -lm -o hello

weitere Kapitel noch in Bearbeitung ...

noch in Bearbeitung ...

Umfangreichere Beispiele

Ein Programm zum Moleküle darstellen. Es ist ähnlich wie Molz3d, geht aber auch mit mehreren Molekülen. Damit lassen sich z.B. auch Komplexe (die aus mehreren Komponenten bestehen) darstellen.
Es lassen sich auch Änderungen in den Molekülen machen.

Hier das Programm: molz.tar.gz

Ein Programm um ein Gas (bisher nur Edelgas) zu simulieren:
edelgas-opengl.tar.gz
Dies verwendet für die Berechnungen OpenCL um auf der Grafikkarte zu rechnen.
(OpenCL zu installieren ist aber viel schwieriger als OpenGL)


Letzte Änderungen: 25.10.2019 / 3.12.2020 / Rolf                                         Validator