Загрузка текстуры в JOGL - PullRequest
       18

Загрузка текстуры в JOGL

2 голосов
/ 21 января 2010

Я пытался загрузить изображение BMP, чтобы использовать его в качестве текстуры в своей программе. Я использовал класс IOStream для расширения DataInputStream, чтобы прочитать пиксели на фотографии с помощью этого кода на основе текстуры код загрузчика для C ++:

//class Data members
public static int BMPtextures[];
public static int BMPtexCount = 30;
public static int currentTextureID = 0;
//loading methode
static int loadBMPTexture(int index, String fileName, GL gl)
    {
        try
        {
            IOStream wdis = new IOStream(fileName);
            wdis.skipBytes(18);
            int width = wdis.readIntW(); 
            int height = wdis.readIntW();
            wdis.skipBytes(28);
            byte buf[] = new byte[wdis.available()];
            wdis.read(buf);
            wdis.close();
            gl.glBindTexture(GL.GL_TEXTURE_2D, BMPtextures[index]);
            gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, 3, width, height, 0, GL.GL_BGR, GL.GL_UNSIGNED_BYTE, buf);
            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);
            currentTextureID = index; 
            return currentTextureID;
    }
        catch (IOException ex)
        {
            // Utils.msgBox("File Error\n" + fileName, "Error", Utils.MSG_WARN);
            return -1;
        }
    }

и код IOStream:

public class IOStream extends DataInputStream {

    public IOStream(String file) throws FileNotFoundException {
        super(new FileInputStream(file));
    }

    public short readShortW() throws IOException {
        return (short)(readUnsignedByte() + readUnsignedByte() * 256);
    }

    public int readIntW() throws IOException {
        return readShortW() + readShortW() * 256 * 256;
    }

    void read(Buffer[] buf) {

    }
}

и призвание:

GTexture.loadBMPTexture(1,"/BasicJOGL/src/basicjogl/data/Font.bmp",gl);

после отладки я понял, что когда дело доходит до этой строки:

IOStream wdis = new IOStream(fileName);

произошло IOExeption и это DispatchException Что это должно означать и как я могу это решить?

Я пытался:

  1. используйте \ и \\ и / и //
  2. измените путь к фотографии и возьмите весь путь от c:\ до photoname.bmp
  3. переименуйте фотографию, используя такие номера, как 1.bmp

Никто не работал.

Ответы [ 3 ]

1 голос
/ 24 января 2010

Судя по вашему последнему комментарию, вы больше не получаете IOException, но у вас все еще есть проблемы с получением текстуры для фактического рендеринга (просто получение белого квадрата).

Я заметил, что следующего кода нет в кодеВы разместили здесь (но могли бы быть в другом месте):

gl.glGenTextures 

Вам необходимо создать мест для ваших текстур, прежде чем связывать их.Также убедитесь, что вы включили текстурирование:

gl.glEnable(GL.GL_TEXTURE2D);

Для получения дополнительной информации / руководств по началу работы с текстурированием OpenGL я рекомендую прочитать NeHe Productions: OpenGL Lesson # 06 .Кроме того, внизу страницы вы найдете пример кода JOGL, который поможет вам преобразовать концепции из языка C в Java.

В любом случае, надеюсь, что это даст вам несколько новых идей.

0 голосов
/ 07 мая 2012

Вот простой способ загрузки текстуры в JOGL. Он также работает с BMP.

public static Texture loadTexture(String file) throws GLException, IOException
{
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(ImageIO.read(new File(file)), "png", os);
    InputStream fis = new ByteArrayInputStream(os.toByteArray());
    return TextureIO.newTexture(fis, true, TextureIO.PNG);
}

также не забудьте включить, связать и установить текстурные координаты.

...
  gl.glEnableClientState(GL2ES1.GL_TEXTURE_COORD_ARRAY);
  if(myTexture == null)  
    myTexture = loadTexture("filename.png");
  myTexture.enable(gl);
  myTexture.bind(gl);
  gl.glTexCoordPointer(2, GL2ES1.GL_FLOAT, 0, textureCoords);
...
0 голосов
/ 27 марта 2010

Вероятно, в этом больше не требуется помощь, но я заметил, что IOStream расширяет DataInputStream, но когда дело доходит до реализации read (), он остается пустым. поэтому, несмотря на то, что вы никогда ничего не читаете в buf, это может объяснить, почему ваша текстура пуста, но у вас нет других проблем.

...