Текстура OpenGL / LWJGL загружается, но текстура не рендерится на квад - PullRequest
0 голосов
/ 15 мая 2018

Я начинаю использовать LWJGL / OpenGL в Java для создания 2D-игры, однако у меня возникают трудности с рендерингом простого квадрата (квадрат) 32x32 с текстурой.Я создал систему загрузки текстуры и следовал соответствующим инструкциям для текстуры, но текстура не будет отображаться.Мой код ниже:

devBlock64.bind();

glEnable(GL_TEXTURE_2D);

GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0, 0);
    GL11.glVertex2f(0, 0);

    GL11.glTexCoord2f(0, 1);
    GL11.glVertex2f(32, 0);

    GL11.glTexCoord2f(1, 1);
    GL11.glVertex2f(32, 32);

    GL11.glTexCoord2f(1, 0);
    GL11.glVertex2f(0, 32);
GL11.glEnd();

glDisable(GL_TEXTURE_2D);

Выше приведен код для каждого вызова "render"."devBlock64" - это просто объект текстуры, который загрузил текстуру 64x64 (но в данном случае это 32x32, потому что я сохранил ее как неправильный размер)

Кроме того, это опции и функции, которые я вызвал после загрузкитекстура и генерация ее id текстуры:

this.bind();

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

Изображение загружается правильно, но оно не будет отображаться.this.bind(); вызывает мою функцию, которая просто делает это: glBindTexture(GL_TEXTURE_2D, id):

И, мой игровой цикл, если кому-то интересно, все остальное было сделано в соответствии с руководствами OpenGL по настройке окна:

public void loop() {
    // Binds GLFW with OpenGL
    GL.createCapabilities();

    glOrtho(0f, 800, 600, 0f, 0f, 1f);

    glClearColor(1.0f, 1f, 1f, 1f);
    //glLoadIdentity();

    world.loadTextures();

    while(!hasWindowRequestedClose()) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        world.onUpdate();
        world.render();

        glfwSwapBuffers(handle);

        glfwPollEvents();
    }

    destroy();
}

1 Ответ

0 голосов
/ 16 июня 2018

Привет, я проверил твой код, и с моей стороны все в порядке.У меня есть несколько предложений.

  • Какую версию opengl вы используете?glBegin() и glEnd() удалены из более новых версий (начиная с версии 3.2).Вместо этого вам нужно загрузить данные вершин в объекты Vertex Buffer.Затем используйте glVertexAttribPointer, чтобы сообщить openGL, как распределяются данные.

  • Лучше использовать шейдеры и привязать текстуру к шейдеру.

Вот мой код для загрузки текстур.

public static int loadTexture(String path) {
 int[] pixels = null;
 int width = 0;
 int height = 0;
 try {
  InputStream resourceBuff = Loader.class.getResourceAsStream(path);
  BufferedImage image = ImageIO.read(resourceBuff);
  width = image.getWidth();
  height = image.getHeight();
  pixels = new int[width * height];
  image.getRGB(0, 0, width, height, pixels, 0, width);
 } catch (IOException e) {
  e.printStackTrace();
 }

 int[] data = new int[width * height];
 for (int i = 0; i < width * height; i++) {
  int a = (pixels[i] & 0xff000000) >> 24;
  int r = (pixels[i] & 0xff0000) >> 16;
  int g = (pixels[i] & 0xff00) >> 8;
  int b = (pixels[i] & 0xff);

  data[i] = a << 24 | b << 16 | g << 8 | r;
 }

 int result = glGenTextures();
 glBindTexture(GL_TEXTURE_2D, result);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
    storeDataInIntBuffer((data)));
 glBindTexture(GL_TEXTURE_2D, 0);
 return result;
}

Надеюсь, это поможет вам.

...