Хобрук: Ваш путь к мастерству в программировании

Текстуры LWJGL и Slick отображаются черным цветом?

Я использую затмение. поэтому в моем рабочем пространстве в рамках моего проекта я создаю новую папку «res» с подпапкой «images», в которой есть все мои png для использования в качестве текстур. Итак, вот метод, который я использую для загрузки текстур:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.Color;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;
import org.lwjgl.input.Mouse;
import java.util.Random;

public class TextureDemo
{
public int count = 0;
private static Texture wood;
Random random = new Random();
public TextureDemo()
{
    initGL(640, 480, "SLICK TEXTURES");
    loadTexture("mozilla");

    int x = 100, y = 100, count = 0, width = 0, height = 0, counter = 10;

    while(true)
    {
        count++;
        if(count == counter)
        {
            x--; y--; width++; height++; counter += random.nextInt(50) + 1;
        }
        render(x, y, width, height);

        Display.update();
        Display.sync(60);

        if(Display.isCloseRequested())
        {

            Display.destroy();
            System.exit(0);
        }
    }
}


private void initGL(int width, int height, String title)
{
    try
    {
        Display.setDisplayMode(new DisplayMode(width, height));

        Display.setTitle(title);
        Display.create();
    }
    catch(LWJGLException e)
    {
        e.printStackTrace();
        Display.destroy();
        System.exit(1);
    }



    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    GL11.glDisable(GL11.GL_COLOR_MATERIAL);

    GL11.glLoadIdentity();
    GL11.glOrtho(0, width, height, 0, 1, -1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

}
public void loadTexture(String key)
{
    try
    {

        wood = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("./res/images/"+key+".png"));

        System.out.println("working." + wood.getTextureID());
    }
    catch(FileNotFoundException e)
    {
        e.printStackTrace();
        Display.destroy();
        System.exit(1);
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }   
}
public void render(int x, int y, int width, int height)
{

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
    GL11.glEnable(GL11.GL_BLEND);
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    System.out.println("working." + wood.getTextureID());

    GL11.glBindTexture(GL11.GL_TEXTURE_2D, wood.getTextureID());
    GL11.glBegin(GL11.GL_QUADS);


    GL11.glTexCoord2f(0, 0);
    GL11.glVertex2f(x, y);
    GL11.glTexCoord2f(1, 0);
    GL11.glVertex2f(x + wood.getImageWidth(), y);
    GL11.glTexCoord2f(1, 1);
    GL11.glVertex2f(x + wood.getImageWidth(), y + wood.getImageHeight());
    GL11.glTexCoord2f(0, 1);
    GL11.glVertex2f(x, y + wood.getImageHeight());

    GL11.glEnd();
    GL11.glDisable(GL11.GL_BLEND);

    System.out.println(wood.getHeight()+ " " +wood.getWidth());


}
public static void main (String[] args)
{

    new TextureDemo();


}

}

ПОЧЕМУ ПОЧЕМУ ПОЧЕМУ мои текстуры черные, лол? Я действительно не понимаю, как мой код сделал это. Возможно ли, что мой компьютер может иметь проблемы, которые вызывают это?

29.08.2013

Ответы:


1

Дважды задавать один и тот же вопрос не поможет. Однако вы должны убедиться, что вы сначала вызываете glBindTexture, прежде чем запускать glBegin.

29.08.2013

2

Извините, но с вашим кодом много проблем. Я бы порекомендовал взглянуть на некоторые учебники по opengl. Арксинтез очень глубокий.

Ваша проблема в том, что текстура "дерево" никогда не привязана к opengl.

Чтобы связать вашу текстуру с контекстом opengl, вы должны вызвать

glBindTexture(GL_TEXTURE_2D, id);

до glbegin()

Идентификатор — это идентификатор текстуры, сгенерированный glGentextures или, в вашем случае, методом slick util. И что такое дерево? В первом блоке кода это идентификатор текстуры, но во втором блоке вы вызываете 'getHeght()' для типа дерева. Я запутался, что такое "дерево".

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

29.08.2013
  • однако в вашем коде много проблем: не могли бы вы указать все проблемы? 29.08.2013
  • Я извиняюсь. Это скорее плохая практика, чем плохой код. Я предполагаю, что методы getHeight/width относятся к текстуре, поэтому установка координат на размер текстуры кажется странной. Передача позиций вершин с помощью того же метода, который связывает текстуру и использует вызовы gl, просто беспорядочна, а четырехугольники используются не очень часто. он же должен отвязать текстуру после рендера. 29.08.2013
  • У меня он привязан к открытому gl. Он отображается как черный четырехугольник. Я пробовал несколько разных изображений, разных размеров, всех степеней двойки. Дерево — это название текстуры. плохо обновляю метод рендеринга 29.08.2013
  • Моя вина - я забыл добавить, что вам также нужно вызвать glEnable(GL_TEXTURE_2D). Сделайте это одним из ваших методов инициализации. 29.08.2013
  • У меня также есть это в моем методе initgl ... хотите ли вы увидеть весь класс? 29.08.2013
  • примечание: параметры width и height не используются в рендере 29.08.2013
  • Из исходного кода, который вы мне дали, я добавил glEnable(GL_TEXTURE_2D), и все заработало. i.imgur.com/JCjOUhT.png 29.08.2013
  • idk ... может быть, это проблема с тем, как я загружаю текстуры? Как мне поместить фотографии в папку res внутри папки проекта? Экран просто становится серым... 29.08.2013
  • Попробуйте установить PNG в TextureLoader.getTexture(PNG, //stuff); в нижний регистр. И я загрузил свой файл изображения под названием Checker в порядке. Возможно, убедитесь, что ваш файл не называется texture.png, потому что при его загрузке загрузчик textureLoader загрузит texture.png.png, что не сработает. 30.08.2013

  • 3

    Вы не включили текстуры! В вашем методе initGL вызовите GL11.glEnable(GL11.GL_TEXTURE_2D).

    30.08.2013
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..