# JOGL BackgroundColor



## Pille (24. Mrz 2008)

Hi,
Ich hab heute mit JOGL und java angefangen. Nach ein paar Tutorials kam dies dabei raus:

```
import java.awt.*;
import java.awt.event.*;
import javax.media.opengl.*;

public class Test
{
	public static void main(String[] args) 
	{
		//create Window, bind OpenGL, set some parameters
		Frame MyWindow = new Frame("My Own Window");
		GLCanvas canvas = new GLCanvas();
		MyWindow.add(canvas);
	    MyWindow.setSize(300, 300);
	    MyWindow.setBackground(Color.red);
	    
	    //set Window event handler
	    MyWindow.addWindowListener(new WindowAdapter()
	    {
	        public void windowClosing(WindowEvent e)
	        {
	            System.exit(0);
	        }
	    });
	    MyWindow.setVisible(true);
	}
}
```
Das geht auch soweit, ausser, dass die Hintergrundfarbe immer schwarz ist. Man sieht ganz kurz wie die Hintergrundfarbe rot ist, aber dann wird sie schwarz. Ich vermute, dass es am GLCanvas liegt, da ich zuerst "GLCanvas canvas =
    GLDrawableFactory.getFactory().createGLCanvas(capabilities);" ausprobiert habe, was aber nicht geht. Compiler konnte "createGLCanvas(capabilities);" nicht finden. 
Dann hab ich auf "GLCanvas ..." gewechselt und es ging. 
Jemand ne Idee?[/code]


----------



## 0x7F800000 (24. Mrz 2008)

Öhm... ich kenne mich damit leider gar nicht aus, aber ich kann dir versichern, dass die rote Hintegrundfarbe des Fenstern nichts damit zu tun hat, es wird sowieso komplett von diesem GLCanvas-Objekt übermalt.

Bei Open GL unter C/C++ kann man die Farbe, auf die der BackBuffer gesetzt wird, mit

```
//  C/C++
glClearColor( r,g,b,a );
```
festgelegt werden, ich nehme mal an, dass es bei JOGL nicht viel abders ist, suche mal nach "setClearColor()" oder nach irgendsowas in der art, ich hab momentan leider keine ahnung wo ich danach suchen muss... :roll:

Öhm... Also, hab jetzt n wenig herumgeblättert: Interface GL schreibt die existenz der Methode

```
//Interface GL
public void glClearColor(float red,
                         float green,
                         float blue,
                         float alpha)
```
vor.

GLCanvas besitzt zudem folgenden getter:

```
//class GL Canvas
public GL getGL();
```

ich hab überhaupt keinen plan von der gesamten Programmstruktur, wie gesagt, hab noch nie irgendetwas mit JOGL oder OGL genacht, aber imho dürfte so etwas vielleicht sogar sinn ergeben:

```
GLCanvas canvas=...;
canvas.getGL().glClearColor(1,0,0,1);
```
vielleicht ist es völliger quatsch, kA


----------



## Pille (24. Mrz 2008)

Danke für deine Antwort. Hab nochmal etwas recherchiert und rumprobiert und zu guter letzt eine Version gefunden, die bei mir zumindest funktioniert. Keine Ahnung ob die Tutorials zu alt (Teilweise von 2003/2004) sind oder ob es einfach mehrere Wege hierbei gibt.
In JOGL läuft das alles ziemlich ähnlich im Bezug zu OpenGL ab. Hier mal mein Code:

```
import java.awt.*;
import java.awt.event.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;

public class Test
{
	public static void main(String[] args) 
	{
		//create Window, bind OpenGL, set some parameters
		Frame MyWindow = new Frame("My Own Window");
		GLCanvas canvas = new GLCanvas();
		MyWindow.add(canvas);
	    MyWindow.setSize(800,600);
	    
            //RenderTest ist nun die Klasse, die für das Zeichnen verantwortlich ist
	    canvas.addGLEventListener(new RenderTest());
	   //Animator ruft die  "display" Funktion von canvas, also somit von RenderTest bei jedem neuem Frame auf. Kann man auch mit einer while(true) Schleife lösen, aber dieser Weg ist ressourcenschonender.
           final Animator animator = new Animator(canvas);
	    
	    //set Window event handler
	    MyWindow.addWindowListener(new WindowAdapter()
	    {
	        public void windowClosing(WindowEvent e)
	        {
	        	animator.stop();
	            System.exit(0);
	        }
	    });
	    MyWindow.setVisible(true);
	    animator.start();
	}
}


import javax.media.opengl.*;

//Hier dann die Ähnlichkeit zu OpenGL; Musste einige Variablennamen ändern (aus GLDrawable wurde anscheinend GLAutoDrawable[Habs net nachgeschlagen, aber so funktionierts bei mir])
public class RenderTest implements GLEventListener
{
	public void init(GLAutoDrawable drawable) {}

	public void display(GLAutoDrawable drawable) 
	{	
		GL gl = drawable.getGL();
		gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );
		gl.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);;
	}

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

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

}
```


----------

