# JOGL polygon smooth



## Runtime (29. Jan 2011)

Hallo Leute,

ich will eine 2D-Grafikengine in Java programmieren. Da die Polygone einfach hässlich aussehen, muss ich sie natürlich antialisen lassen, wo auch schon den springenden Punkt wäre.. Es funktioniert nicht.

```
package cyrill.primate2d;

import com.sun.opengl.util.Animator;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;

public class PolygonSmooth implements GLEventListener {

    public static void main(String[] args) {
        Frame frame = new Frame("Polygon smooth");
        GLCanvas canvas = new GLCanvas();

        canvas.addGLEventListener(new PolygonSmooth());
        frame.add(canvas);
        frame.setSize(640, 480);
        final Animator animator = new Animator(canvas);
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                new Thread(new Runnable() {

                    public void run() {
                        animator.stop();
                        System.exit(0);
                    }
                }).start();
            }
        });
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        animator.start();
    }

    public void init(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();
	gl.glEnable(GL.GL_BLEND);
        gl.glEnable(GL.GL_POLYGON_SMOOTH);
        gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
        gl.glClearColor(1, 1, 1, 1);
    }

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    }

    public void display(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
	gl.glBegin(GL.GL_POLYGON);
            gl.glColor4f(0.5f, 0.8f, 0.2f, 0.5f);
            gl.glVertex2f(-0.6f, 0.9f);
            gl.glColor4f(0.1f, 0.2f, 0.5f, 0.8f);
            gl.glVertex2f(0.2f, -0.4f);
            gl.glColor4f(0.3f, 0.6f, 0.7f, 0.3f);
            gl.glVertex2f(0.4f, 0.6f);
	gl.glEnd();

        gl.glFlush();
    }

    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
    }
}
```

Alternative, für die, die C++ besser beherrschen :

```
#ifdef WIN32
#include <Windows.h>
#endif
#include <GL\GLUT.h>
#include <GL\GLU.h>
#include <GL\GL.h>

void initGraphics() {
	glClearColor(1, 1, 1, 1);
	glEnable(GL_BLEND);
	glEnable(GL_POLYGON_SMOOTH);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

void display() {
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glBegin(GL_POLYGON);
		glColor4f(0.5f, 0.8f, 0.2f, 0.5f);
		glVertex2f(-0.6, 0.9);
		glColor4f(0.1f, 0.2f, 0.5f, 0.8f);
		glVertex2f(0.2, -0.4);
		glColor4f(0.3f, 0.6f, 0.7f, 0.3f);
		glVertex2f(0.4, 0.6);
	glEnd();

	glutSwapBuffers();
}

void reshape(GLint width, GLint height) {
}

void updateScene() {
	glutPostRedisplay();
}

int main(int argc, char **argv) {
#ifdef WIN32
	HWND hWnd = GetConsoleWindow();
	ShowWindow( hWnd, SW_HIDE );
#endif

	glutInit(&argc, argv);
	glutInitWindowSize(600, 400);
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
	glutCreateWindow("GLUT Window!");

	initGraphics();

	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutIdleFunc (updateScene);

	glutMainLoop();

	return 0;
}
```

Danke 

Edit:
Frage vergessen . Wo liegt der Fehler?


----------



## Runtime (1. Feb 2011)

Ok, habs langsam gemerkt, dass Grafik und Java nicht zusammenpasst. Gehe mal in einem C++ Forum nachfragen.


----------



## Guest2 (1. Feb 2011)

Moin,




Runtime hat gesagt.:


> Ok, habs langsam gemerkt, dass Grafik und Java nicht zusammenpasst. Gehe mal in einem C++ Forum nachfragen.



na, das würde ich so nicht unterschreiben wollen! 

Wenn es ein gutes C++ Forum (oder besser noch ein OpenGL Forum) wäre, dann wird man Dir da vermutlich wohl sagen das GL_POLYGON_SMOOTH einfach böse ist  (Mag sein, dass es bei reinem 2D trotzdem okey sein kann). Grundsätzlich würde ich Dir aber ehr zu MSAA raten (sofern die Zielplattform das hergibt:


```
final GLCapabilities glCapabilities = new GLCapabilities();
		
		glCapabilities.setNumSamples(2);
		glCapabilities.setSampleBuffers(true);
		
		final GLCanvas glCanvas = new GLCanvas(glCapabilities);
```

Gruß,
Fancy


----------



## Marco13 (1. Feb 2011)

Runtime hat gesagt.:


> Ok, habs langsam gemerkt, dass Grafik und Java nicht zusammenpasst. Gehe mal in einem C++ Forum nachfragen.



KCA, oder -1... Vielleicht ist das Problem einfach schwierig zu lösen (egal in welchem Forum). Habe kurz im Netz gesucht, und teilweise sogar gelesen, dass Polygon Smoothing heute nicht mehr von allen GraKas unterstützt wird. Aber so wie Fancy es angedeutet hat...

```
GLProfile profile = GLProfile.get(GLProfile.GL3bc);
        GLCapabilities glCapabilities = new GLCapabilities(profile);
        glCapabilities.setNumSamples(4);
        glCapabilities.setSampleBuffers(true);
        GLCanvas canvas = new GLCanvas(glCapabilities);
```
sieht das Polygon zumindest bei mir schön glattgelutscht aus.


----------



## Runtime (1. Feb 2011)

Guest2 hat gesagt.:


> Grundsätzlich würde ich Dir aber ehr zu MSAA raten


Dann hätte ich nicht in Java programmiert 

Hab setNumSamples mal ausprobiert, hat aber nicht funktioniert. Vllt ist es noch nützlich zu sagen, dass es bei den Linien funktioniert, allerdings nur wenn ich GL_LINE_SMOOTH aktiviere.

@Marco13
Die Klasse GLProfile gibts bei mir gar nicht, welche Version brauchst du?


----------



## Marco13 (1. Feb 2011)

Ja, da hat sich in den letzten (nicht oder kaum unterscheidbaren) Versionen von JOGL einiges geändert. Die, die in bezug auf die API "die aktuellste" sein sollte, sollte unter Index of /deployment/webstart/archive zu finden sein.


EDIT: In deiner Signatur fehlt noch was:

```
boolean stupidCodeReturns = getValue();
if(stupidCodeReturns == true) {System.out.println("true");}
else if(stupidCodeReturns == false) {System.out.println("false");}
[b]else throw new IllegalStateException("A boolean must be true or false!");[/b]
```


----------



## Runtime (1. Feb 2011)

Danke, habs irgendwie hinbekommen, dass JOGL jetzt läuft . Aber sobald irgendeine Methode von GLProfile aufgerufen wird, gibt es eine NullPointerException:

```
at javax.media.opengl.GLProfile.getProfileMap(GLProfile.java:1576)
        at javax.media.opengl.GLProfile.isGL4bcAvailable(GLProfile.java:147)
        at javax.media.opengl.GLProfile.glAvailabilityToString(GLProfile.java:238)
        at javax.media.opengl.GLProfile.glAvailabilityToString(GLProfile.java:306)
        at javax.media.opengl.GLProfile.initProfilesForDefaultDevices(GLProfile.java:1279)
        at javax.media.opengl.GLProfile.access$000(GLProfile.java:67)
        at javax.media.opengl.GLProfile$1.run(GLProfile.java:113)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.media.opengl.GLProfile.initSingleton(GLProfile.java:111)
        at javax.media.opengl.GLProfile.validateInitialization(GLProfile.java:1420)
        at javax.media.opengl.GLProfile.getProfileMap(GLProfile.java:1572)
        at javax.media.opengl.GLProfile.isGL3bcAvailable(GLProfile.java:155)
        at javax.media.opengl.GLProfile.isGL3bcAvailable(GLProfile.java:194)
        at jogl2test.Main.main(Main.java:16)
Exception in thread "Thread-2" java.lang.NoClassDefFoundError: Could not initialize class javax.media.opengl.GLDrawableFactory
        at javax.media.opengl.GLDrawableFactory$2.run(GLDrawableFactory.java:171)
        at java.lang.Thread.run(Thread.java:619)
```
Edit:
Hab jetzt mal wahllos Natives in den Projektordner kopiert und dann kommt die Exception nicht mehr 
GL3bc ist aber nicht available, nur GL2* und das Anti-Aliasing funktioniert noch immer nicht.:noe:


----------



## Marco13 (2. Feb 2011)

Ach ja, die Frage welche JARs/DLLs benötigt werden ist auch ziemlich diffizil. Hatte mir irgendwann mal (durch Iteration über die Potenzmenge der vorhandenen Libs  ) diese Liste zusammenklamüsert

```
gluegen-rt.dll
gluegen-rt.jar
jogl.all.jar
jogl_desktop.dll
nativewindow.all.jar
nativewindow_awt.dll
nativewindow_win32.dll
newt.all.jar
newt.dll
```

Wenn er GL3 nicht unterstützt ... hm - hast du irgendwie eine ältere Grafikkarte (oder vielleicht einen veralteten Treiber...?)


----------



## Runtime (2. Feb 2011)

Ich habe eine Intel Graphics Media Accelerator (GMA) X3100 Grafikkarte. Was zählt als alt?


----------



## maki (2. Feb 2011)

Was Marco13 meinte war, ob deine Grafikkarte neue oder besser aktuelle Standards unterstützt, laut Wikipedia ist bei OpenGL 1.5 schluss: Intel GMA - Wikipedia, the free encyclopedia


----------



## Runtime (2. Feb 2011)

Heisst das dann wohl auch, dass ich mich vom Anti-Aliasing verabschieden kann? 
Btw: Treiber ist aktuell.


----------



## maki (2. Feb 2011)

Anti-alisasing sollte auch schon bei OpenGL 1.5 funktionieren.

Kannst mal versuchen das direkt beim Treiber einzustellen?


----------



## Runtime (2. Feb 2011)

Wie macht man das? Bin nicht so der Hardwaretyp.


----------



## maki (2. Feb 2011)

Runtime hat gesagt.:


> Wie macht man das? Bin nicht so der Hardwaretyp.


Ich bin ein "Googletyp": GTAForums.com -> How to turn on anti-aliasing in Intel GMA X3100?

Hab selber keine GMA 3100...


----------



## Runtime (2. Feb 2011)

Joa hab natürlich auch gegoogelt, einfach nach Einstellungen allgemein.
Edit:
Steht nichts darüber, wie man direkt beim Treiber etwas einstellt, nur dass Intel Grafikkarten kein Antialiasing unterstützen... Warum kann Flash das denn tun?


----------



## Marco13 (2. Feb 2011)

Was da gemeint war, war wohl ein Rechtsklick auf den Windows-Desktop, im Menü "Eigenschaften" auswählen, im Dialog dann den Tab "Einstellungen", dort dann rechts unten "Erweitert..." und dann schauen, ob dort irgendwelche Grafikkartenspezifischen Tabs sind. Evtl. auch mal schauen, ob mit dem Treiber zusammen irgendein Konfigurationsprogramm o.ä. installiert wurde....

EDIT: Es KANN natürlich sein, dass die Grafikkarte das nicht in Hardware unterstützt, und dass z.B. Flash sowas mit Software nachbaut....


----------



## maki (2. Feb 2011)

Runtime, wir haben doch schon in deinem letzten Thread herausgefunden dass deine GK nciht wirklich für sowas geeignet ist: http://www.java-forum.org/plauderecke/111527-grafikkartentreiber-update.html


----------



## Runtime (2. Feb 2011)

2D Antialiasing ist ja nicht gerade eine riesige Herausforderung, das dürfte meine GPU schon tun. Hab ja bald mal meine Konfirmation, dann bekomm ich genug Geld für einen neuen Laptop mit einer GeForce.


----------



## maki (2. Feb 2011)

Ein Netbook mit ION Chipsatz (da ist eine Geforce 9300/9400 drinnen) hätte es schon getan wenn dir ein Atom reicht, kostet auch nicht mehr als ein Netbook mit dem Intel GMA Schrott.


----------



## Runtime (6. Mai 2011)

Dem hab ich jetzt mit einer GTX 570 Abhilfe geschafft


----------



## Marco13 (7. Mai 2011)

Konfirmationen sind schon was feines


----------

