# Wie kriege ich das mit den Texturen nur hin?



## magma (22. Mai 2007)

Ich versuche verzweifelt eine Texture auf ein Objekt zu bekommen.
Ich habe mir das Tutorial von http://www.jogl.info/ durchgelesen und die Programme auch laufen lassen was auch bis zur Lektion 4 funktioniert. 
Ich musste allerdings einiges am Quellcode ändern damit das Programm läuft.

Was ich geändert habe bei Lektion 4.

In der Klasse Beispielszene

Ich nehme import net.java.games.jogl.*; raus dafür import javax.media.opengl.*; rein.

Ich bekomme bei 
GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(glcaps);
die Fehlermeldung createGLCanvas is undifiend for the type GLDrawableFactory

deshalb ersetze ich es durch
	GLCanvas canvas = canvas = new GLCanvas();

In der Klasse BeispielszeneView

Ich ersetze wieder
import net.java.games.jogl.*;
und füge noch
	import javax.media.opengl.glu.*;
ein.

Ich bekomme die Fehlermeödung
The type BeispielszeneView must implement the inherited abstract method
GLEventListener.init(GLAutoDrawable)
Ich ersetze also
	GLDrawable durch GLAutoDrawable

Als nächstes ersetze ich 
	GLU glu = arg0.getGLU(); durch GLU glu = new GLU();


Bei
gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_pos);
bekomme ich die Fehlermeldung	
The method glLightfv(int, int, float[], int)in the type GL is not applicable for 
arguments (int, int, float)

Ich füge einen int wert hinzu
	gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, light_color_am, 0);

Bei 
	gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT, mat_ambient);
das selbe.

Ich ersetze durch 
	gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT, mat_ambient, 0);

Dann erst laeuft das Programm.


Bei Lektion 5 ist es das selbe.

Ich füge erst einmal
	import javax.media.opengl.*;
import javax.media.opengl.glu.*;
ein.

Dann bekomme ich bei 
	 dest = ByteBuffer.allocateDirect(data.length * BufferUtils.SIZEOF_INT);
die Fehlermeldung
	BufferUtils canot be resolved
Ich ändere in 
	BufferUtil
und füge
	import com.sun.opengl.util.BufferUtil;
ein.

Die nächste Fehlermeldung bei
	gl.glGenTextures(1, tmp);
lautet
	The method glGenTextures(int, in[], int) in the type GL is not applicable for the arguments (int, int[])

Ich ersetze also durch
	gl.glGenTextures(1, tmp, 1);

Damit sind dann alle Fehlermeldungen verschwunden und ich starte das Programm.
Das Fenster erscheint bleibt aber leer und ich bekomme folgende Fehlermeldung.

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Required 786432 remaining bytes in buffer, only had 0
	at com.sun.gluegen.runtime.BufferFactory.rangeCheckBytes(BufferFactory.java:274)
	at com.sun.opengl.impl.GLImpl.glTexImage2D(GLImpl.java:21147)
	at TextureGenerator.makeRGBTexture(TextureGenerator.java:90)
	at BeispielszeneView.defineTexture(BeispielszeneView.java:235)
	at BeispielszeneView.init(BeispielszeneView.java:27)
	at com.sun.opengl.impl.GLDrawableHelper.init(GLDrawableHelper.java:72)
	at javax.media.opengl.GLCanvas$InitAction.run(GLCanvas.java:271)
	at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:189)
	at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:265)
	at javax.media.opengl.GLCanvas.display(GLCanvas.java:130)
	at javax.media.opengl.GLCanvas.paint(GLCanvas.java:142)
	at sun.awt.RepaintArea.paintComponent(Unknown Source)
	at sun.awt.RepaintArea.paint(Unknown Source)
	at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)


Ich benutze Windows Xp Professional SP2
Java:	JRE 1.6.0_01
Jogl:	jogl-1.1.0-rc3


Was mache ich denn falsch.

magma


----------



## doctus (23. Mai 2007)

habe das selbe problem. 

lg doctus


----------



## doctus (23. Mai 2007)

hab ne lösung gefunden. nutz die Klasse Texture aus der jogl-api. beispiel findet sich bei den demos auf http://jogl.dev.java.net

lg doctus


----------



## magma (24. Mai 2007)

Hallo doctus,
ich habe Mittlerweilen auch eine Lösung gefunden.

Ich musste ein ByteBuffer rewind in den Quelltext einfügen dann geht es auch.

Deine Lösung interessiert mich aber auch. In welcher der Demos hast Du das denn gefunden?

magma


----------



## doctus (24. Mai 2007)

ZIP: http://download.java.net/media/jogl/builds/nightly/jogl-demos-src.zip

die datei ist "jogl-demos\src\demos\texture\TestTexture.java"

dokumentation: http://download.java.net/media/jogl...blic/com/sun/opengl/util/texture/Texture.html

lg doctus


----------



## magma (24. Mai 2007)

Hallo doctus,
danke für den Link.
Das funktioniert.
Was mir an der Demo nicht gefällt ist das wenn man kleine Texturen lädt, die gezoomt werden damit sie die Zeichenfläche ganz füllen. Bei sehr kleinen Texturen werden die dann sehr unschön.
Wisst Du wie man erreicht das eine kleine Textur wiederholt wird anstatt gezoomt um die Zeichenfläche ganz zu füllen?

magma


----------



## Gast (25. Mai 2007)

versuchs mal, indem du beim zeichnen des objectes, wo die texture draufkommt, die texturkoordinaten anders setzt.

lg doctus


----------



## magma (29. Mai 2007)

Hallo Herr Gast.
Ja das war es.
Ich musste nur diese Texturkoordinaten anders wählen und schon ging es.
Vielen Dank für die Anregung.

magma


----------



## doctus (29. Mai 2007)

nix herr gast^^

guck mal auf die letzte zeile im beitrag. hatte nur vergessen mich einzuloggen^^

lg doctus


----------



## magma (29. Mai 2007)

Aber Hallo.
Entschuldigung das habe ich übersehen.
Vielen Dank noch mal für den Tip.

magma


----------

