# glTexParameter / glTexImage2D Problem



## Helgon (18. Jan 2012)

Hey.. ich hab mal wieder ein Problem :/

Ich hab echt alles durchsucht was Googel hergegeben hat, aber bin leider auf nix gestoßen.

Ich arbeite ja grad die Nehe Tutorials durch und da werden Texturen noch mit dem 
	
	
	
	





```
devil.IL
```
 geladen, und das ist doch ziemlich abweichend von der leichten Variante mit Slick. Also hab ich probiert es irgendwie auf meine Art zu basteln und nach gefühlten Stunden hab ich es zumindest hinbekommen, dass der Block seine Textur zumindest irgendwie ändert wenn ich diese binde.

Ich hab nun das 


```
try {
			t1 = TextureLoader.getTexture("JPG", new FileInputStream(new File("res/1.jpg")));

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		ByteBuffer textureBuffer = BufferUtils.createByteBuffer(t1.getTextureData().length);
		textureBuffer.put(t1.getTextureData());
		textureBuffer.flip();
		
		GL11.glBindTexture(GL11.GL_TEXTURE_2D, t1.getTextureID());
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, (int)t1.getWidth(), (int)t1.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, textureBuffer);
```

Das ist die erste Variante, die ansatzweise funktioniert, aber wirklich nur ansatzweise den der Würfel hat nicht die Textur sondern nur irgend ne Farbe aus der Textur (die Textur ist überwiegend braun, also ist der Würfel auch braun).

Weis wer vllt was da falsch läuft?

Mir selbst fehlt noch 
	
	
	
	





```
glGenTextures
```
 aber ich hab grad einfach kein Peil wie ich das noch reinbringen könnte.

Das ist echt schlimm. Egal welches OpenGL Tutorial im Internet, keins ist up2date oder funktioniert / man kann einfach nicht drauf los lernen sondern sich erst mit tausend Problemen rumschlagen :/

Das ist der Code wie ich ihn aus der LWJGL Lösung hab, aber eben mit devil.IL (was nicht mehr fortgeführt wird)


```
IntBuffer image = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer();
        IL.ilGenImages(1, image);
        IL.ilBindImage(image.get(0));
        IL.ilLoadImage(path);
        IL.ilConvertImage(IL.IL_RGB, IL.IL_BYTE);
        ByteBuffer scratch = ByteBuffer.allocateDirect(IL.ilGetInteger(IL.IL_IMAGE_WIDTH) * IL.ilGetInteger(IL.IL_IMAGE_HEIGHT) * 3);
        IL.ilCopyPixels(0, 0, 0, IL.ilGetInteger(IL.IL_IMAGE_WIDTH), IL.ilGetInteger(IL.IL_IMAGE_HEIGHT), 1, IL.IL_RGB, IL.IL_BYTE, scratch);

        // Create A IntBuffer For Image Address In Memory
        IntBuffer buf = ByteBuffer.allocateDirect(12).order(ByteOrder.nativeOrder()).asIntBuffer();
        GL11.glGenTextures(buf); // Create Texture In OpenGL

        GL11.glBindTexture(GL11.GL_TEXTURE_2D, buf.get(0));
        // Typical Texture Generation Using Data From The Image

        // Create Nearest Filtered Texture
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, buf.get(0));
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, IL.ilGetInteger(IL.IL_IMAGE_WIDTH), 
                IL.ilGetInteger(IL.IL_IMAGE_HEIGHT), 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, scratch);
```

Vielleicht erweist sich nochmal jemand gnädig, weil mein Kopf platz und ich hab grad echt kein Peil :/

Grüße


----------



## Guest2 (18. Jan 2012)

Moin,



Helgon hat gesagt.:


> Ich hab echt alles durchsucht was Googel hergegeben hat, aber bin leider auf nix gestoßen.



Was glaubst Du den was die Klasse TextureIO macht, die ich im anderen Thread gezeigt habe?

Viele Grüße,
Fancy


----------



## Marco13 (18. Jan 2012)

Funktioniert es denn mit der zweiten Lösung? Anhand der Symptome (Textur mit Braun drin -> komplett brauner Würfel) kann man bisher nicht ausschließen, dass einfach nur die Texturkoordinaten falsch sind. Ein KSKB wäre natürlich praktisch, aber vielleicht findet man da notfalls auch schnell was...


----------



## Helgon (19. Jan 2012)

Ich schaus mir gleich an Fancy 

@Marco:

Ne, die Texturkordinaten sinds nicht, weil wen ich 
	
	
	
	





```
GL11.glBindTexture(GL11.GL_TEXTURE_2D, buf.get(0));
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, IL.ilGetInteger(IL.IL_IMAGE_WIDTH), 
                IL.ilGetInteger(IL.IL_IMAGE_HEIGHT), 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, scratch);
```
weglasse stimmt ja alles. 

Hier der ganze code. Müsstest aber Slick und LWJGL einbinden


```
package nehe;
import org.newdawn.slick.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.*;
import org.lwjgl.input.*;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;

import static org.lwjgl.util.glu.GLU.*;
import static org.lwjgl.opengl.GL11.*;

public class Lektion2 {
	
	Texture t1,t2,t3;
	Texture[] tex = new Texture[3];
	boolean vsync;
	boolean light, lp, lf;
	float r1,r2;
	float xr, yr, zr;
	float xspeed, yspeed;
	float z = -5;

	float ambient[] = {0.5f,0.5f,0.5f,1f};
	float diffuse[] = {1f,1f,1f,1f};
	float pos[] = {0.0f, 0.0f, 2.0f, 1.0f};
	
	public Lektion2(){
		
		try {
			Display.setDisplayMode(new DisplayMode(800,600));
			Display.create();
		} catch (LWJGLException e) {
			e.printStackTrace();
		}
		
		initGL();
		load();
		
		r1 = 1;
		r2 = 1;
		xr = 1;
		yr = 1;
		zr = 1;
		
		while(!Display.isCloseRequested()){
			
			
			input();
			
			r1+=1;
			r2+=1;
			
			xr += 0.2f;
			yr += 0.3f;
			zr += 0.4f;
			
			
	        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);          // Clear The Screen And The Depth Buffer
	                              // Finished Drawing The Triangle

	        glLoadIdentity();                          // Reset The Current Modelview Matrix
	        glTranslatef(0,0.0f,z);                // Move Left 1.5 Units And Into The Screen 6.0
	        glRotatef(xr,1,0,0);
	        glRotatef(yr,0,1,0);
	        
	        glBindTexture(GL_TEXTURE_2D, t1.getTextureID());
	        GL11.glBegin(GL11.GL_QUADS);                            // Start Drawing Quads
	        // Front Face
	        GL11.glNormal3f( 0.0f, 0.0f, 1.0f);                 // Normal Pointing Towards Viewer
	        GL11.glTexCoord2f(0.0f, 0.0f); GL11.glVertex3f(-1.0f, -1.0f,  1.0f);    // Point 1 (Front)
	        GL11.glTexCoord2f(1.0f, 0.0f); GL11.glVertex3f( 1.0f, -1.0f,  1.0f);    // Point 2 (Front)
	        GL11.glTexCoord2f(1.0f, 1.0f); GL11.glVertex3f( 1.0f,  1.0f,  1.0f);    // Point 3 (Front)
	        GL11.glTexCoord2f(0.0f, 1.0f); GL11.glVertex3f(-1.0f,  1.0f,  1.0f);    // Point 4 (Front)
	        // Back Face
	        GL11.glNormal3f( 0.0f, 0.0f,-1.0f);                 // Normal Pointing Away From Viewer
	        GL11.glTexCoord2f(1.0f, 0.0f); GL11.glVertex3f(-1.0f, -1.0f, -1.0f);    // Point 1 (Back)
	        GL11.glTexCoord2f(1.0f, 1.0f); GL11.glVertex3f(-1.0f,  1.0f, -1.0f);    // Point 2 (Back)
	        GL11.glTexCoord2f(0.0f, 1.0f); GL11.glVertex3f( 1.0f,  1.0f, -1.0f);    // Point 3 (Back)
	        GL11.glTexCoord2f(0.0f, 0.0f); GL11.glVertex3f( 1.0f, -1.0f, -1.0f);    // Point 4 (Back)
	        // Top Face
	        GL11.glNormal3f( 0.0f, 1.0f, 0.0f);                 // Normal Pointing Up
	        GL11.glTexCoord2f(0.0f, 1.0f); GL11.glVertex3f(-1.0f,  1.0f, -1.0f);    // Point 1 (Top)
	        GL11.glTexCoord2f(0.0f, 0.0f); GL11.glVertex3f(-1.0f,  1.0f,  1.0f);    // Point 2 (Top)
	        GL11.glTexCoord2f(1.0f, 0.0f); GL11.glVertex3f( 1.0f,  1.0f,  1.0f);    // Point 3 (Top)
	        GL11.glTexCoord2f(1.0f, 1.0f); GL11.glVertex3f( 1.0f,  1.0f, -1.0f);    // Point 4 (Top)
	        // Bottom Face
	        GL11.glNormal3f( 0.0f,-1.0f, 0.0f);                 // Normal Pointing Down
	        GL11.glTexCoord2f(1.0f, 1.0f); GL11.glVertex3f(-1.0f, -1.0f, -1.0f);    // Point 1 (Bottom)
	        GL11.glTexCoord2f(0.0f, 1.0f); GL11.glVertex3f( 1.0f, -1.0f, -1.0f);    // Point 2 (Bottom)
	        GL11.glTexCoord2f(0.0f, 0.0f); GL11.glVertex3f( 1.0f, -1.0f,  1.0f);    // Point 3 (Bottom)
	        GL11.glTexCoord2f(1.0f, 0.0f); GL11.glVertex3f(-1.0f, -1.0f,  1.0f);    // Point 4 (Bottom)
	        // Right face
	        GL11.glNormal3f( 1.0f, 0.0f, 0.0f);                 // Normal Pointing Right
	        GL11.glTexCoord2f(1.0f, 0.0f); GL11.glVertex3f( 1.0f, -1.0f, -1.0f);    // Point 1 (Right)
	        GL11.glTexCoord2f(1.0f, 1.0f); GL11.glVertex3f( 1.0f,  1.0f, -1.0f);    // Point 2 (Right)
	        GL11.glTexCoord2f(0.0f, 1.0f); GL11.glVertex3f( 1.0f,  1.0f,  1.0f);    // Point 3 (Right)
	        GL11.glTexCoord2f(0.0f, 0.0f); GL11.glVertex3f( 1.0f, -1.0f,  1.0f);    // Point 4 (Right)
	        // Left Face
	        GL11.glNormal3f(-1.0f, 0.0f, 0.0f);                 // Normal Pointing Left
	        GL11.glTexCoord2f(0.0f, 0.0f); GL11.glVertex3f(-1.0f, -1.0f, -1.0f);    // Point 1 (Left)
	        GL11.glTexCoord2f(1.0f, 0.0f); GL11.glVertex3f(-1.0f, -1.0f,  1.0f);    // Point 2 (Left)
	        GL11.glTexCoord2f(1.0f, 1.0f); GL11.glVertex3f(-1.0f,  1.0f,  1.0f);    // Point 3 (Left)
	        GL11.glTexCoord2f(0.0f, 1.0f); GL11.glVertex3f(-1.0f,  1.0f, -1.0f);    // Point 4 (Left)
	        GL11.glEnd();                               // Done Drawing Quads
			
	        xr += xspeed;
	        yr += yspeed;
	        
			Display.update();
			Display.sync(60);
		}
		
	}
	
	public void input(){
		
			while(Keyboard.next()){
				if(Keyboard.isKeyDown(Keyboard.KEY_F)){
					light = !light;
				}
			}
			if(light){
		        glEnable(GL_LIGHTING);        // Enable Lighting
			}else{
		        glDisable(GL_LIGHTING);        // Enable Lighting
			}
		
			if (Keyboard.isKeyDown(Keyboard.KEY_PRIOR)) {       // Is Page Up Being Pressed?
	            z-=0.2f;                               // If So, Move Into The Screen
	        }
	        if (Keyboard.isKeyDown(Keyboard.KEY_NEXT)) {        // Is Page Down Being Pressed?
	            z+=0.2f;                               // If So, Move Towards The Viewer
	        }
			if(Keyboard.isKeyDown(Keyboard.KEY_UP)){
				xspeed -=0.1f;
			}
			if(Keyboard.isKeyDown(Keyboard.KEY_DOWN)){
				xspeed +=0.1f;
			}
			if(Keyboard.isKeyDown(Keyboard.KEY_LEFT)){
				yspeed -=0.1f;
			}
			if(Keyboard.isKeyDown(Keyboard.KEY_RIGHT)){
				yspeed +=0.1f;
			}
		
	}
	
	public void load(){
		try {
			t1 = TextureLoader.getTexture("JPG", new FileInputStream(new File("res/1.jpg")));

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
        IntBuffer buf = ByteBuffer.allocateDirect(12).order(ByteOrder.nativeOrder()).asIntBuffer();

		glGenTextures(buf);
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, t1.getTextureID());

		ByteBuffer textureBuffer = BufferUtils.createByteBuffer(t1.getTextureData().length);
		textureBuffer.put(t1.getTextureData());
		textureBuffer.flip();
		
		GL11.glBindTexture(GL11.GL_TEXTURE_2D, t1.getTextureID());
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, (int)t1.getWidth(), (int)t1.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, textureBuffer);
	
		
	}
	
	public void initGL(){
        glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
        glShadeModel(GL_SMOOTH); // Enable Smooth Shading
        glClearColor(0.4f, 0.4f, 0.7f, 0.0f); // Black Background
        glClearDepth(1.0); // Depth Buffer Setup
        glEnable(GL_DEPTH_TEST); // Enables Depth Testing
        glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do

        glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
        glLoadIdentity(); // Reset The Projection Matrix

        // Calculate The Aspect Ratio Of The Window
        gluPerspective(45.0f, (float) 800 / (float) 600, 0.1f, 100.0f);
        glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix

        // Really Nice Perspective Calculations
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
        
        // Really Nice Perspective Calculations
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
        ByteBuffer temp = ByteBuffer.allocateDirect(16);
        temp.order(ByteOrder.nativeOrder());
        glEnable(GL_LIGHT1);                          // Enable Light One
        glLight(GL_LIGHT1, GL_AMBIENT, (FloatBuffer)temp.asFloatBuffer().put(ambient).flip());              // Setup The Ambient Light
        glLight(GL_LIGHT1, GL_DIFFUSE, (FloatBuffer)temp.asFloatBuffer().put(diffuse).flip());              // Setup The Diffuse Light
        glLight(GL_LIGHT1, GL_POSITION,(FloatBuffer)temp.asFloatBuffer().put(pos).flip());         // Position The Light
        
        

	}
	
	public static void main(String[] args){
		new Lektion2();
	}
	
}
```


----------



## Spacerat (19. Jan 2012)

Während der Abarbeitung der Nehe-Tuts meinerseits, ist dieses hier entstanden und zwar eigentlich erst für die Lektionen in den dort gezeigten Bildern (13, 14, 15... da geht's hauptsächlich um Text). Inzwischen ist auch ein Texturloader dabei, aber der ist längst noch nicht fertig, aber für Nehe reicht er allemal. Deinem Code nach zu urteilen, dürfte des Lesson 7 (und nicht 2 ) sein. Diese sieht mit meiner Extension-API so aus:
	
	
	
	





```
/*
 *      This Code Was Created By Jeff Molofee 2000
 *      A HUGE Thanks To Fredric Echols For Cleaning Up
 *      And Optimizing The Base Code, Making It More Flexible!
 *      If You've Found This Code Useful, Please Let Me Know.
 *      Visit My Site At nehe.gamedev.net
 */

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.util.glu.GLU.*;
import static org.lwjgl.opengl.jgl.JGL.*;

import java.awt.Toolkit;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.jgl.JGLTexture;
import org.lwjgl.input.Keyboard;

/**
 * Port of NeHe's Lesson 7 to LWJGL
 * Title: Texture Filters, Lighting & Keyboard Control
 * Uses LWJGL [url=http://www.lwjgl.org/]lwjgl.org - Home of the Lightweight Java Game Library[/url]
 *
 * Be sure that the LWJGL libraries are in your classpath
 *
 * Ported directly from the C++ version
 */
public class Lesson07 {

	private static final Toolkit tk = Toolkit.getDefaultToolkit();
	private static final URL currentDir;

	static {
		try {
			currentDir = new File(".").getAbsoluteFile().toURI().toURL();
		} catch(MalformedURLException e) {
			throw new RuntimeException(e);
		}
	}
	
    private boolean done = false;
    private boolean fullscreen = false;
    private final String windowTitle = "NeHe's OpenGL Lesson 7 for LWJGL (Texture Filters, Lighting & Keyboard Control)";
    private boolean f1 = false;
    private DisplayMode displayMode;

    private boolean light;                                      // Lighting ON / OFF
    private boolean lp;                                         // L Pressed?
    private boolean fp;                                         // F Pressed?
    private float xrot;                                         // X Rotation
    private float yrot;                                         // Y Rotation
    private float xspeed;                                       // X Rotation Speed
    private float yspeed;                                       // Y Rotation Speed
    private float z = -5.0f;                                        // Depth Into The Screen
    private float lightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };  // Ambient Light Values ( NEW )
    private float lightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };      // Diffuse Light Values ( NEW )
    private float lightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f }; // Light Position ( NEW )
    private int filter;                                         // Which Filter To Use
    private int texture[] = new int[3];                         // Storage for 3 textures

    public static void main(String args[]) {
        boolean fullscreen = false;
        if(args.length>0) {
            if(args[0].equalsIgnoreCase("fullscreen")) {
                fullscreen = true;
            }
        }

        Lesson07 l7 = new Lesson07();
        l7.run(fullscreen);
    }
    public void run(boolean fullscreen) {
        this.fullscreen = fullscreen;
        try {
            init();
            while (!done) {
                mainloop();
                render();
                Display.update();
            }
            cleanup();
        }
        catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }
    }
    private void mainloop() {
        if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) {       // Exit if Escape is pressed
            done = true;
        }
        if(Display.isCloseRequested()) {                     // Exit if window is closed
            done = true;
        }
        if(Keyboard.isKeyDown(Keyboard.KEY_F1) && !f1) {    // Is F1 Being Pressed?
            f1 = true;                                      // Tell Program F1 Is Being Held
            switchMode();                                   // Toggle Fullscreen / Windowed Mode
        }
        if(!Keyboard.isKeyDown(Keyboard.KEY_F1)) {          // Is F1 Being Pressed?
            f1 = false;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_L) && !lp) {
            lp=true;
            light=!light;
            if (!light)                             // If Not Light
            {
                glDisable(GL_LIGHTING);       // Disable Lighting
            }
            else                                    // Otherwise
            {
                glEnable(GL_LIGHTING);        // Enable Lighting
            }
        }
        else if (!Keyboard.isKeyDown(Keyboard.KEY_L)) {
            lp=false;
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_F) && !fp) {    // Is F Key Being Pressed?
            fp=true;                                // fp Becomes TRUE
            filter+=1;                              // filter Value Increases By One
            if (filter>2            )               // Is Value Greater Than 2?
            {
                filter=0;                           // If So, Set filter To 0
            }
        }
        else if (!Keyboard.isKeyDown(Keyboard.KEY_F)) {     // Has F Key Been Released?
            fp=false;                               // If So, fp Becomes FALSE
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_PRIOR)) {       // Is Page Up Being Pressed?
            z-=0.0002f;                               // If So, Move Into The Screen
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_NEXT)) {        // Is Page Down Being Pressed?
            z+=0.0002f;                               // If So, Move Towards The Viewer
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {          // Is Up Arrow Being Pressed?
            xspeed-=0.00001f;                          // If So, Decrease xspeed
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {        // Is Down Arrow Being Pressed?
            xspeed+=0.00001f;                          // If So, Increase xspeed
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {       // Is Right Arrow Being Pressed?
            yspeed+=0.00001f;                          // If So, Increase yspeed
        }
        if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {        // Is Left Arrow Being Pressed?
            yspeed-=0.00001f;                          // If So, Decrease yspeed
        }
    }
    private void switchMode() {
        fullscreen = !fullscreen;
        try {
            Display.setFullscreen(fullscreen);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    private boolean render() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);          // Clear The Screen And The Depth Buffer

        glLoadIdentity();                          // Reset The Current Modelview Matrix

        glTranslatef(0.0f,0.0f,z);                     // Translate Into/Out Of The Screen By z

        glRotatef(xrot,1.0f,0.0f,0.0f);                        // Rotate On The X Axis By xrot
        glRotatef(yrot,0.0f,1.0f,0.0f);                        // Rotate On The Y Axis By yrot
        glBindTexture(GL_TEXTURE_2D, texture[filter]);                // Select A Texture Based On filter

        glBegin(GL_QUADS);                            // Start Drawing Quads
        // Front Face
        glNormal3f( 0.0f, 0.0f, 1.0f);                 // Normal Pointing Towards Viewer
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Point 1 (Front)
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Point 2 (Front)
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Point 3 (Front)
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Point 4 (Front)
        // Back Face
        glNormal3f( 0.0f, 0.0f,-1.0f);                 // Normal Pointing Away From Viewer
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Point 1 (Back)
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Point 2 (Back)
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Point 3 (Back)
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Point 4 (Back)
        // Top Face
        glNormal3f( 0.0f, 1.0f, 0.0f);                 // Normal Pointing Up
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Point 1 (Top)
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Point 2 (Top)
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Point 3 (Top)
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Point 4 (Top)
        // Bottom Face
        glNormal3f( 0.0f,-1.0f, 0.0f);                 // Normal Pointing Down
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Point 1 (Bottom)
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Point 2 (Bottom)
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Point 3 (Bottom)
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Point 4 (Bottom)
        // Right face
        glNormal3f( 1.0f, 0.0f, 0.0f);                 // Normal Pointing Right
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Point 1 (Right)
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Point 2 (Right)
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Point 3 (Right)
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Point 4 (Right)
        // Left Face
        glNormal3f(-1.0f, 0.0f, 0.0f);                 // Normal Pointing Left
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Point 1 (Left)
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Point 2 (Left)
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Point 3 (Left)
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Point 4 (Left)
        glEnd();                               // Done Drawing Quads

        xrot+=xspeed;                               // Add xspeed To xrot
        yrot+=yspeed;                               // Add yspeed To yrot
        return true;
    }
    private void createWindow() throws Exception {
        Display.setFullscreen(fullscreen);
        DisplayMode d[] = Display.getAvailableDisplayModes();
        for (int i = 0; i < d.length; i++) {
            if (d[i].getWidth() == 640
                && d[i].getHeight() == 480
                && d[i].getBitsPerPixel() == 32) {
                displayMode = d[i];
                break;
            }
        }
        Display.setDisplayMode(displayMode);
        Display.setTitle(windowTitle);
        Display.create();
    }
    private void init() throws Exception {
        createWindow();

        loadTextures();
        initGL();
    }
    private void loadTextures() {
        texture = loadTexture("Data/Crate.png");
    }
    private void initGL() {
        glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
        glShadeModel(GL_SMOOTH); // Enable Smooth Shading
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
        glClearDepth(1.0f); // Depth Buffer Setup
        glEnable(GL_DEPTH_TEST); // Enables Depth Testing
        glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do

        glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
        glLoadIdentity(); // Reset The Projection Matrix

        // Calculate The Aspect Ratio Of The Window
        gluPerspective(45.0f, (float) displayMode.getWidth() / (float) displayMode.getWidth(),0.1f,100.0f);
        glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix

        // Really Nice Perspective Calculations
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
        ByteBuffer temp = ByteBuffer.allocateDirect(16);
        temp.order(ByteOrder.nativeOrder());
        glLight(GL_LIGHT1, GL_AMBIENT, (FloatBuffer)temp.asFloatBuffer().put(lightAmbient).flip());              // Setup The Ambient Light
        glLight(GL_LIGHT1, GL_DIFFUSE, (FloatBuffer)temp.asFloatBuffer().put(lightDiffuse).flip());              // Setup The Diffuse Light
        glLight(GL_LIGHT1, GL_POSITION,(FloatBuffer)temp.asFloatBuffer().put(lightPosition).flip());         // Position The Light
        glEnable(GL_LIGHT1);                          // Enable Light One
    }
    private void cleanup() {
        Display.destroy();
    }
    /**
     * Texture loading directly from LWJGL examples
     */
    private int[] loadTexture(String path) {
		JGLTexture tex;
		try {
			tex = createTexture(tk.createImage(new URL(currentDir, path)));
	        IntBuffer buf = BufferUtils.createIntBuffer(3);
	        glGenTextures(buf); // Create Texture In OpenGL

	        // Create Nearest Filtered Texture
	        glBindTexture(GL_TEXTURE_2D, buf.get(0));
	        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	        glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.getWidth(), tex.getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.getData());

	        // Create Linear Filtered Texture
	        glBindTexture(GL_TEXTURE_2D, buf.get(1));
	        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	        glTexImage2D(GL_TEXTURE_2D, 0, 4, tex.getWidth(), tex.getWidth(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.getData());

	        // Create MipMapped Texture
	        glBindTexture(GL_TEXTURE_2D, buf.get(2));
	        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
	        gluBuild2DMipmaps(GL_TEXTURE_2D, 4, tex.getWidth(), tex.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, tex.getData());

	      return new int[]{ buf.get(0), buf.get(1), buf.get(2) };     // Return Image Addresses In Memory
		} catch (Exception e) {
			return null;
		}        
    }
}
```


----------



## Helgon (19. Jan 2012)

Hey, vieln vieln dank! Das wird mir sicherlich helfen. Einziges Problem:

Wo kommt der .jgl Import her?



```
import static org.lwjgl.opengl.jgl.JGL.*;
```

Google finde ich nichts und wenn doch nur was von wegen JOGL, aber das ist doch ne andere Lib, und warum ists dann hier jgl und nicht jogl und warum dann auch noch im lwjgl?

Googel war diesmal wirklich nicht sonderlich hilfreich.

Könntest mir wer sagen wo das her kommt / wo ichs herkrieg?

Grüße

Edit: Dann noch ne andere Frage an der Stelle - besonders an dich Fancy.

Bringt es irgendwelche Vorteile jgl, devil.IL oder Slick zum Laden der Texturen zu verwenden, oder ist es damit einfach nur einfacher / oder reicht deine TextureIO Klasse da vollkommen?

Grüße


----------



## Spacerat (19. Jan 2012)

Helgon hat gesagt.:


> Wo kommt der .jgl Import her?...
> ...Googel war diesmal wirklich nicht sonderlich hilfreich.
> 
> Könntest mir wer sagen wo das her kommt / wo ichs herkrieg?


Das kann ich mir lebhaft vorstellen... Fancy brauchst dazu auch nicht Interviewen. In dem Link oben ("dieses hier") steht ja bereits, was es damit auf sich hat. Wenn du davon was findest, dürften die meisten Links in dieses Forum verweisen. Kurzum: JGL ist von mir und wurde zur Darstellung von Text in 3D (also nicht blos Bitmap-Fonts) entwickelt.
[EDIT]@Fancy: Ach ja, wenn du mehr Zeit hast als ich, kannst du JGL ja mal überfliegen und vllt. einige viele Verbesserungsvorschläge machen. Bei den Fonts stört mich nämlich noch ein wenig die Performance bei grösseren Texten. Ich denke, da muss z.B. per Tesselation noch einiges gehen.[/EDIT]


----------



## Helgon (19. Jan 2012)

Ahhhh!

Sry, ich überlebe momentan den Tag immer nur mit Hilfe von Koffein im Gramm Bereich :/ War wohl gestern schon etwas spät.

Vielen Dank!! Das hat mir so unglaublich geholfen! Es ist unglaublich frustrierend, wenn man nix zum laufen kriegt, weil die Tutorial Samples erst gar nicht laufen  (und wenn man grad (noch ) nicht mit unglaublicher Sachkompetenz gesegnet ist, wirds echt nervig)

Danke!

Noch eine Frage, ist NATÜRLICH NICHT! undankbar oder so gemeint, aber bieten Slick, devil IL usw. diese ganzen Libs irgendwelche Performance Vorteile etc. (ka was noch eine Rolle spielen könnte) oder gibt es die einfach nur dummen Leuten wie mir die Arbeit zu vereinfachen? 

Grüße und nochmal danke! 

Edit: Hab mir mal die JGL und JGLTexture Klasse angeschaut und muss sagen, dass ichs für nicht so "kompliziert" gehalten habe ein Image reinzuladen (wenn ichs mit dem Schnipsel TextureIO von Fancy vergleiche).

Ich bin grad am grübeln. Kann ich bedenkenlos versuchen weiter zu machen, oder ist es essentiell erstmal das voll und ganz zu verstehen (deine Klassen)?


----------



## Helgon (19. Jan 2012)

Was ich mir grad überleg.

Gibt es nicht eine Möglichkeit, die Textur Daten auch über Slick irgendwie zu bekommen? Es gibt ja 
	
	
	
	





```
tex.getTextureData()
```
, aber das sind wohl nicht die, die glu als Parameter erwartet :/

Also


```
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, tex.getWidth(), tex.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, tex.getData())
```

Also wies bei dir über die eigene Methode getData() passiert, aber da steig ich nicht ganz durch :/ wie ichs selbst für Slick implementieren könnte.


----------



## Guest2 (19. Jan 2012)

Die gezeigte TextureIO ist primär erstmal ein kleines Stück Code das zeigt, wie man ein Bild in einen Buffer bekommt (mit reinem Java) und den Inhalt dieses Buffers anschließend auf die Grafikkarte schiebt. Imho ist das ein guter Ausgangspunkt, um davon ausgehend die Klasse dann um genau die Funktionen zu erweitern, die man gerade braucht (wie bei Dir jetzt scheinbar die Erzeugung von Mipmaps).

Außerdem ist der Umgang von Ressourcen in OpenGL immer recht ähnlich (ID erzeugen, ID binden, Parameter setzen, Ressourcen hochladen), so das ich es schon für sinnvoll halte das zu verstehen.

In dem Zusammenhang könntest Du Dir auch mal unter OpenGL Common Mistakes die Punkte "Texture upload and pixel reads", "Creating a Texture" und "Automatic mipmap generation" ansehen.

Insbesondere steht dort zum Thema gluBuild2DMipmaps:



			
				http://www.opengl.org/wiki/Common_Mistakes hat gesagt.:
			
		

> Never use this. Use either GL_GENERATE_MIPMAP (requires GL 1.4) or the glGenerateMipmap function (requires GL 3.0).



(das gilt übrigens für eine ganze Reihe von Funktionen aus glu)


@Spacerat: Ja, wenn ich mal etwas Zeit übrig habe, kann ich da gerne mal einen Blick drauf werfen. Allerdings ist meine Zeit leider auch nur endlich und meine Motivation legacy / depricated Code durchzusehen nur begrenzt. Es kann also etwas dauern. 

Viele Grüße,
Fancy


----------



## Spacerat (19. Jan 2012)

Hmm... erinnerst du dich noch an die Sache mit den Buffern? Ebenso verhält es sich mit Textur-APIs. Jedem Tierchen sein Blässierchen. Ich hatte damals für JOGL einen Weg gesucht 3D Text darstellen zu können und zwar ebenso einfach wie es mit WGL in den NeHe-Tuts geht - deswegen heissen die Font-Methoden auch [c]getBitmapFont[/c] bzw. [c]getOutlineFont[/c] und die für die Ausgabe von Text halt [c]printf[/c]. Warum bitte sollte ich anfangen Fontdateien in Java zu lesen und zu parsen, wenn es in der Java-Standard-API bereits Mechanismen dafür gibt? Selbiges überlegte ich mir für die Texturen - ImageLoader gibt es in Java bereits, deswegen stäubte ich mich dagegen, eine Textur per Dateinamen bzw. -url zu erstellen und legte deswegen vielmehr Wert darauf, die Textur beliebige Formate (ARGB, ABGR usw.) wandeln zu können. Alles in allem hat sich das Ergebnis nun in JGL manifestiert.
Nun, ich selber wüsste nicht, was an den durch diese diversen APIs (Slick, Devil usw) zurückgegebenen Buffern anders sein soll als bei JGL. LWJGL und auch JOGL benötigen sie nun mal in dieser Form. Der eigentliche Grund aber, warum ich bei meinen Texturen Images statt Dateinamen übergebe ist jener, da ich schon seit Urzeiten an einem AmigaOS-Datatype (wem's nicht geläufig ist...) ähnlichem Mechanismus für Java arbeite. Ich lade meine Bilder, Sounds und hoffentlich auch bald (vernünftig) 3D-Objekte nur noch über eine simple Codezeile:
	
	
	
	





```
public static <T extends DT_Object> T getFile(URL url); // wahlweise auch (String), (File) oder auch (URL, String)
```
Dank der Typisierung bekommt man seit Java1.5 eine [c]ClassCastException[/c]wenn man ein Bild (DT_Image) erwartet, obwohl man eine Sounddatei (DT_Audio) geladen hat. Leider ist das ganze noch weniger Spruchreif als JGL und obendrein wüsste ich eh' (immer noch) nicht, wo und wie man eigene Projekte hostet. Dafür gibt's bald 'nen eigenen Server ich denk'.
[EDIT]





Guest2 hat gesagt.:


> ...wie bei Dir jetzt scheinbar die Erzeugung von Mipmaps...


Nee, soweit isset noch nicht - muss ja auch nicht... GLU macht das schon. Aber der Hinweis auf den Fehler ist interessant... den hat dann wohl NeHe schon gemacht und ich hab' ihn schlicht geguttenbergert.[/EDIT][EDIT]@Helgon: Verstehen musst du an meinen Klassen nur, wie du sie verwenden kannst jedoch nicht wie diese im Detail funktionieren. Meine Doku ist zwar noch recht dürftig (aber immerhin vorhanden ) aber du machst des schon... lass dich nicht abhalten [/EDIT]


----------



## Helgon (19. Jan 2012)

Ich danke mal wieder für die Antworten 



> @Helgon: Verstehen musst du an meinen Klassen nur, wie du sie verwenden kannst jedoch nicht wie diese im Detail funktionieren. Meine Doku ist zwar noch recht dürftig (aber immerhin vorhanden ) aber du machst des schon... lass dich nicht abhalten



Ja es ist natürlich nur teilweise die Funktionsweise, wie welche Pixel in welches Byte wohin geschoben werden und warum etc.

Natürlich bleib ich dran 

Ich hab grad einfach weiter gemacht (mim Slick und das ausgelassen wo texParameter notwending sind (sind ja eh nur glaub ich eh nur 1-2 Tutorial + die Fonts) oder eben so umgesetzt das es ohne geht.

Ist echt motivierend zu sehen was man mit OpenGL alles machen kann (und das die Samples auch mal gehen )

Aber wie immer.. erstmal grob verstehen und dann selber was basteln, dann festig es sich erst  - wird aber definitiv spaßig!

Grüße


----------

