2013-10-09 3 views
0

Я пытаюсь написать игровой движок в lwjgl, и я столкнулся с проблемой рендеринга, и мне бы хотелось немного помочь. В основном, я выполнил некоторые шаги в lwjgl-basics (mattdesl on GitHub) и создал класс Texture и раздел в моем рендерере, которые работают, за исключением того, что они не отображают текстуру. Вот код ...Текстура LWJGL не отображается

public void drawTexturedRectangle(float x1, float y1, float w, float h, Texture t){ 
     t.bind(); 
     GL11.glColor4f(1.0f, 0, 1.0f, 1.0f); 
     GL11.glBegin(GL11.GL_QUADS); 
     GL11.glTexCoord2f(0, 0); 
     GL11.glVertex2f(x1, y1); 
     GL11.glTexCoord2f(1.0f, 0); 
     GL11.glVertex2f(x1 + w, y1); 
     GL11.glTexCoord2f(1.0f, 1.0f); 
     GL11.glVertex2f(x1 + w, y1 + h); 
     GL11.glTexCoord2f(0, 1.0f); 
     GL11.glVertex2f(x1, y1 + h); 
     GL11.glEnd(); 
    } 

Это то, где он оказывает. Вот класс Texture:

package com.nightfall.morningside; 

import java.io.*; 
import java.net.URL; 
import java.nio.ByteBuffer; 

import de.matthiasmann.twl.utils.*; 

import org.lwjgl.opengl.*; 
import org.lwjgl.opengl.GL12.*; 
import org.lwjgl.BufferUtils; 

public class Texture { 
    public int width; 
    public int height; 
    public int id; 

    public Texture(URL pathToTexture){ 
     try { 
      InputStream pngstream = pathToTexture.openStream(); 
      PNGDecoder pngdecoder = new PNGDecoder(pngstream); 

      width = pngdecoder.getWidth(); 
      height = pngdecoder.getHeight(); 

      int bpp = 4; 

      ByteBuffer buffer = BufferUtils.createByteBuffer(bpp * width * height); 

      pngdecoder.decode(buffer, width * bpp, PNGDecoder.Format.RGBA); 

      buffer.flip(); 

      id = GL11.glGenTextures(); 

      GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); 

      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); 
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); 
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); 
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); 

      GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, buffer); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void bind(){ 
     GL11.glBindTexture(GL11.GL_TEXTURE_2D, id); 
    } 
} 

Класс TexturedRectangle:

package com.nightfall.morningside.geometry; 

import com.nightfall.morningside.Texture; 
import com.nightfall.morningside.Textured; 

public class TexturedRectangle extends Rectangle implements Textured{ 
    public Texture texture; 

    public TexturedRectangle(float xone, float yone, float w, float h, Texture t) { 
     super(xone, yone, w, h); 
     texture = t; 
    } 

    public Texture getTexture() { 
     return texture; 
    } 

} 

Класс Прямоугольник:

package com.nightfall.morningside.geometry; 

public class Rectangle { 
    private float x1; 
    private float y1; 
    private float width; 
    private float height; 

    public Rectangle(float xone, float yone, float w, float h){ 
     x1 = xone; 
     y1 = yone; 
     width = w; 
     height = h; 
    } 

    public float getX1(){ 
     return x1; 
    } 

    public float getY1(){ 
     return y1; 
    } 

    public float getHeight(){ 
     return height; 
    } 

    public float getWidth(){ 
     return width; 
    } 

    public Point getLocation(){ 
     return new Point(x1, y1); 
    } 
} 

И интерфейс текстурированные:

package com.nightfall.morningside; 

public interface Textured { 
    public Texture getTexture(); 
} 

А класс точки :

package com.nightfall.morningside.geometry; 

public class Point { 
    private float x1; 
    private float y1; 

    public Point(float x, float y){ 
     x1 = x; 
     y1 = y; 
    } 

    public float getX(){ 
     return x1; 
    } 

    public float getY(){ 
     return y1; 
    } 
} 

Надеюсь, это все. Я считаю, что это проблема в способе рендеринга, но, возможно, проблема в том, где я загружаю текстуры. Если вам нужно что-нибудь еще, я поставлю его для вас. Спасибо.

+0

О, и только для уточнения, это с l wjgl 2.90 – cstream24

+0

Если вы создаете движок, то не используйте все устаревшие методы OpenGL. – Vallentin

+0

Я только делаю это, чтобы учиться - я все заменю, как только я уверен, что смогу на самом деле это сделать. – cstream24

ответ

0

Текстура отключена по умолчанию. Если вы хотите, чтобы сделать фактурную примитивный (текстурированный четырехугольник, например), вы должны активировать текстурирование с

glEnable(GL_TEXTURE2D); 
glBindTexture(GL_TEXTURE_2D, textureId); 

Первая строка говорит OpenGL использовать текстурирование, второй указать, какие текстуры вы хотите использовать.

Чтобы прекратить использование текстуры, вы можете:

  • Bind от нуля до GL_TEXTURE_2D: glBindTexture(GL_TEXTURE_2D, 0);или
  • Отключить GL_TEXTURE_2D: glDisable(GL_TEXTURE_2D);

редактировать, я забыл все GLxx. префиксы (статический импорт в моих кодах)

+0

Вы не можете просто дать 'glBindTexture' 0 в качестве дескриптора, вам нужно дать ему фактический дескриптор. – Vallentin

+0

Фактически вы можете, теперь оно устарело, но это означает развязать текстуру. OP использует немедленный режим, glBindTexture (X, 0) является приемлемым, хорошо работает и даже решает проблемы для меня. См. Http://www.talisman.org/opengl-1.1/Reference/glBindTexture.html. –

+0

О, если бы вы сказали ему, что это способ связать текстуру, я не видел/не думаю, что вы, где подразумеваете, как отвязать ее, извините за недоразумение. – Vallentin

Смежные вопросы