Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2020, 10:33   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию неправильно отображаются картинки в OpenGL LWJGL

Загружаю PNG файлы и рисую их в окне LWJGL.
Одна из картинок отображается нормально, а остальные приобретают синий оттенок.
Картинки взяты из майнкрафта (откуда же еще?) и были обработаны следующим образом:
картинка из майнкрафта открыта в фотошопе. CTRL+A, CTRL+C. Затем создаём новое изображение 16х16 и вставляем туда скопированное. Затем сохраняем его как PNG.
В результате, если в проводнике открыть свойства этих картинок, то там написано 16x16 32bits 1178 bytes. То есть, они все одинаковые.
Почему тогда одна грузится правильно, а остальные нет?
Если брать оригинальные текстуры из майнкрафта, не пропуская их через фотошоп, то они все грузятся с синим оттенком.
Код:
	private void renderScene(){
        int screenWidth = windowWidth;
        int screenHeight = windowHeight;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0.0, screenWidth, screenHeight, 0.0, -1.0, 1.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glEnable(GL_TEXTURE_2D);

        glBindTexture(GL_TEXTURE_2D, tex1);

        glBegin(GL_QUADS);
        int x = 0;
        int y = 0;
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(x, y, 0.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(x + 400.0f, y, 0.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(x + 400.0f, y + 400.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(x, y + 400.0f, 0.0f);
        glEnd();

        glBindTexture(GL_TEXTURE_2D, tex2);

        glBegin(GL_QUADS);
        x = 400;
        y = 0;
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(x, y, 0.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(x + 400.0f, y, 0.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(x + 400.0f, y + 400.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(x, y + 400.0f, 0.0f);
        glEnd();

        glBindTexture(GL_TEXTURE_2D, tex3);

        glBegin(GL_QUADS);
        x = 0;
        y = 400;
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(x, y, 0.0f);
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(x + 400.0f, y, 0.0f);
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(x + 400.0f, y + 400.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(x, y + 400.0f, 0.0f);
        glEnd();

        glDisable(GL_TEXTURE_2D);
    }

    private void loadTextures(){
        tex1 = loadTexture("/textures/grass.png");
        tex2 = loadTexture("/textures/grass1.png");
        tex3 = loadTexture("/textures/tnt_side.png");
    }

    private void unloadTextures(){
        glDeleteTextures(tex1);
        glDeleteTextures(tex2);
        glDeleteTextures(tex3);
    }

    public int loadTexture(String fileName){
        try {
            BufferedImage img;
            if (fileName.startsWith("/")) {
                URL url = getClass().getResource(fileName);
                img = ImageIO.read(url);
            } 
            else
            {
                img = ImageIO.read(new File(fileName));
            }
            IntBuffer ib = BufferUtils.createIntBuffer(1);
            glGenTextures(ib);
            glBindTexture(GL_TEXTURE_2D, ib.get(0));
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            int w = img.getWidth();
            int h = img.getHeight();
            ByteBuffer pixels = BufferUtils.createByteBuffer(w * h * 4);
            int[] rawPixels = new int[w * h];
            img.getRGB(0,0, w, h, rawPixels, 0, w);
            pixels.asIntBuffer().put(rawPixels);
            GLU.gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, w,h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
            System.out.println(fileName + ", ID: " + ib.get(0));
            return ib.get(0);
        }
        catch (IOException e) {
            System.out.println(fileName);
            e.printStackTrace();
            return 0;
        }
    }
Вложения
Тип файла: zip textures.zip (2.3 Кб, 0 просмотров)

Последний раз редактировалось BLACK_RAIN; 06.04.2020 в 10:47.
BLACK_RAIN вне форума Ответить с цитированием
Старый 06.04.2020, 11:31   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

разобрался. Просто забыл байты перевернуть.
Я изначально грузил зелёную текстуру. Зелёный байт находится посередине и по-этому переворачивание на него не влияет. А так же не влияет на чёрный и белый цвета. А я до текущего момента только их и использовал.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
django картинки не отображаются dbalor Python 3 20.09.2018 09:41
русские символы неправильно отображаются getUp Общие вопросы C/C++ 5 09.06.2014 11:03
Неправильно отображаются русские буквы Merano Общие вопросы Delphi 2 12.12.2012 16:14
Не отображаются текстуры в OpenGL monolit111 Общие вопросы C/C++ 4 20.09.2012 14:40