OpenGL Java загрузки PNG текстуры не работают должным образом - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь загрузить png-файл в качестве текстуры, но, хотя у меня нет ошибок, я не могу увидеть текстуру.Единственное, что я получаю, это квадрат одного цвета.Я уже искал примеры и не вижу, какую ошибку я совершаю.Вот код:

        final Image image = SWTImageFactory.getImage(ImageFactory.CROSS_SYMBOL_IMAGE);
        final ImageData imageData = image.getImageData();

        ByteBuffer buffer = ByteBuffer.allocate(4*imageData.width * imageData.height);
        int p, r, g, b, a;

        for (int y = 0; y<imageData.height; y++) {
            for (int x = 0; x < imageData.width; x++) {

                p =  imageData.getPixel(x, y);
                a = (p >> 24) & 0xFF;  // get pixel bytes in ARGB order
                r = (p >> 16) & 0xFF;
                g = (p >> 8) & 0xFF;
                b = (p >> 0) & 0xFF;

                buffer.put((byte)r);   // fill in bytes in RGBA order
                buffer.put((byte)g);
                buffer.put((byte)b);
                buffer.put((byte)a); 
             }
        }

        buffer.rewind();
        gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 4,imageData.width, imageData.height,0,
                        GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, buffer);

        gl.glEnable(GL.GL_TEXTURE_2D);
        int [] textures = new int [1];
        gl.glGenTextures(1, textures, 0); 

        gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0]);

        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
        gl.glTexParameteri (GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);
        gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);

        gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);  

        gl.glBegin(GL.GL_QUADS);

        gl.glTexCoord2f(0.0f, 0.0f);
        gl.glVertex3f(100.0f, 100.0f, 0.0f);

        gl.glTexCoord2f(0.0f, 1.0f);
        gl.glVertex3f(100.0f, 200.0f, 0.0f);

        gl.glTexCoord2f(1.0f, 1.0f);
        gl.glVertex3f(200.0f, 200.0f, 0.0f);

        gl.glTexCoord2f(1.0f, 0.0f);
        gl.glVertex3f(200.0f, 100.0f, 0.0f);

        gl.glEnd();
        gl.glDisable(GL.GL_TEXTURE_2D);

1 Ответ

1 голос
/ 12 декабря 2011

Вы вызываете gl.glTexImage2D до того, как какая-либо текстура будет привязана (или, возможно, будет привязана какая-либо другая текстура), но эта функция изменяет изображение текстуры текущего связанного объекта текстуры. Так что в вашем коде вы должны назвать его после gl.glBindTexture(GL.GL_TEXTURE_2D, textures[0]).

И, между прочим, я надеюсь, что этот код не называется каждым кадром (на что намекают функции рисования), так как вам не следует создавать новый объект текстуры (не считывая чтение изображения с жесткого диска) каждый кадр (не говоря уже об этом) Вы фактически не удаляете это). На самом деле вы должны создать объект текстуры в некотором коде инициализации, вставить в него изображение и настроить его параметры так, чтобы в коде рисования вам приходилось только вызывать glBindTexture (и, возможно, glEnable(GL_TEXTURE_2D) или подобные вещи).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...