Tabuleiro em OpenGL

Ola pessoal, estou tentando fazer um tabuleiro para um jogo. Mas detalhe tenho as imagens já, precisava importar isso e exibir na tela, são várias imagens que compõe o tabuleiro, mas não estou conseguindo exibir ao menos uma, na tela que abre, não exibe a imagem, está toda preta. Programo Java faz um certo tempo, mas não tenho experiência em OpenGL. Estou utilizando JOGL, pois é pré-requisito. Até usei como base um exemplo da própria biblioteca, mas continua na mesma. Pensei que pudesse ser talvez o formato de imagem (PNG), mas utilizei outro (JPG) e nada. Segue abaixo o código que estou utilizando:

public void display(GLAutoDrawable drawable)
{
	GL gl = drawable.getGL();
	gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
	
	if (newTexture)
	{
		newTexture = false;

		if (texture != null)
		{
			texture.dispose();
			texture = null;
		}

		try
		{
			System.err.println("Loading texture...");
			texture = TextureIO.newTexture(file, true);
			System.err.println("Texture estimated memory size = " + texture.getEstimatedMemorySize());
		} catch (IOException e)
		{
			e.printStackTrace();
			return;
		}
	}

	if (texture != null)
	{
		texture.enable();
		texture.bind();
		gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
		TextureCoords coords = texture.getImageTexCoords();

		gl.glBegin(GL.GL_QUADS);
		gl.glTexCoord2f(coords.left(), coords.bottom());
		gl.glVertex3f(0, 0, 0);
		gl.glTexCoord2f(coords.right(), coords.bottom());
		gl.glVertex3f(1, 0, 0);
		gl.glTexCoord2f(coords.right(), coords.top());
		gl.glVertex3f(1, 1, 0);
		gl.glTexCoord2f(coords.left(), coords.top());
		gl.glVertex3f(0, 1, 0);
		gl.glEnd();
		texture.disable();
	}
}

Alguém poderia me ajudar?

Agradeço desde já

Você precisa mapear o MIN_FILTER da textura. Veja o tutorial em:

gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);

Veja os tutoriais em:
http://pontov.com.br/site/opengl/204-texturas-parte-1
http://pontov.com.br/site/index.php/opengl/205-texturas-parte-2

Olá Vini, agradeço pela resposta… Consegui fazer funcionar aqui com suas dicas e mais umas alterações. Estou conseguindo colocar uma das peças do tabuleiro lá, mas para o restante agora é só “multiplicar”.
Mas tenho outra duvida, como vou dispor as peças ao longo do tabuleiro, e para que isso tenha um mínimo de interatividade (necessária), vou precisar clicar numa das peças e posteriormente clicar na posição para onde desejo “movê-la”…

você teria algum exemplo de como implementar o click do mouse em um objeto, capturando-se a posição do mesmo na tela?

agradeço desde já

Isso é chamado de “picking”:
http://www.lighthouse3d.com/opengl/picking/

Outra dica. A biblioteca JOGL não é muito recomendada. Passou na mão de várias pessoas, e seu desenvolvimento é muito instável. Para jogo, o recomendado mesmo é a LWJGL: http://lwjgl.org/

É a mesma usada pelo MineCraft. E, além da OpenGL, dá suporte a input e som.

Muito obrigado Vini, como sempre de muita valia suas respostas… Olhei seu link e aproveitei e procurei mais sobre “picking” (não sabia que era esse o nome kkkk)… consegui resolver o problema do click… ele consegue achar exatamente a região de interesse agora…

Sobre o JOGL e o LWJGL, acredito que seja melhor mesmo Vini, vi em outras oportunidades aqui no forum você falando isso, e em outros lugares também… mas o fato é que preciso utilizar ela (pré-requisito)…

Com mas uma parte da jornada concluída, tem peço mais um coisa Vini, sem querer encher o saco… kkkkk
Eu preciso fazer arrastar essa peça, representada pela “texture” (imagem) do código abaixo, e soltar ela em um outro ponto do tabuleiro… tem mais algo pra mim ler ai ou pode me ajudar com isso (me clarear as ideias)?

    private GLU glu;
    private GLCapabilities caps;
    private GLCanvas canvas;
    private static final int BUFSIZE = 512;
    private Point pickPoint = new Point();

    public static void main(String[] args)
    {
        new Moinho().executar();
    }

    private void executar()
    {
        JFrame frame = new JFrame("Tabuleiro Jogo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        caps = new GLCapabilities();
        canvas = new GLCanvas(caps);

        setTextureFile(new File("src/images/black.jpg"));
        canvas.repaint();

        canvas.addGLEventListener(this);
        canvas.addMouseListener(this);
        canvas.addKeyListener(this);

        frame.getContentPane().add(canvas);
        frame.setSize(800, 600);
        frame.show();

        canvas.requestFocusInWindow();
    }
    private File file;
    private Texture texture;

    public void setTextureFile(File file)
    {
        this.file = file;
    }

    public void init(GLAutoDrawable drawable)
    {
        drawable.setGL(new DebugGL(drawable.getGL()));

        GL gl = drawable.getGL();
        glu = new GLU();

        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glDepthFunc(GL.GL_LESS);
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glShadeModel(GL.GL_FLAT);
        gl.glDepthRange(0.0, 1.0); /* The default z mapping */
    }

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
    {
        GL gl = drawable.getGL();
        try
        {
            texture = TextureIO.newTexture(file, true);
        } catch (Exception ex)
        {
            ex.printStackTrace();
        }
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrtho(0.0, 8.0, 0.0, 8.0, -0.5, 2.5);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public void display(GLAutoDrawable drawable)
    {
        GL gl = drawable.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
        pickItem(gl);
        drawRects(gl, GL.GL_RENDER);
        gl.glFlush();
    }

    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)
    {}

    public void keyReleased(KeyEvent key)
    {}

    public void mouseClicked(MouseEvent mouse)
    {}

    public void mousePressed(MouseEvent mouse)
    {
        pickPoint = mouse.getPoint();
        canvas.display();
    }

    public void mouseReleased(MouseEvent mouse)
    {}

    public void mouseEntered(MouseEvent mouse)
    {}

    public void mouseExited(MouseEvent mouse)
    {}

    public void keyTyped(KeyEvent e)
    {}

    public void keyPressed(KeyEvent e)
    {}

    private void drawRects(GL gl, int mode)
    {
        if (mode == GL.GL_SELECT)
        {
            gl.glLoadName(1);
        }
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        if (texture != null)
        {
            texture.enable();
            texture.bind();
            gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
            gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
            TextureCoords coords = texture.getImageTexCoords();

            gl.glBegin(GL.GL_QUADS);
            gl.glTexCoord2f(coords.left(), coords.bottom());
            gl.glVertex3f(0, 0, 0);
            gl.glTexCoord2f(coords.right(), coords.bottom());
            gl.glVertex3f(1f, 0, 0);
            gl.glTexCoord2f(coords.right(), coords.top());
            gl.glVertex3f(1f, 1f, 0);
            gl.glTexCoord2f(coords.left(), coords.top());
            gl.glVertex3f(0, 1f, 0);
            gl.glEnd();
            texture.disable();
        }
    }

    private void infoHits(int hits, int buffer[])
    {
        int names, ptr = 0;

        System.out.println("hits = " + hits);
        // ptr = (GLuint *) buffer;
        for (int i = 0; i < hits; i++)
        { /* for each hit */
            names = buffer[ptr];
            System.out.println(" numero de nomes por hit = " + names);
            ptr++;
            System.out.println("  z1 é " + buffer[ptr]);
            ptr++;
            System.out.println(" z2 é " + buffer[ptr]);
            ptr++;
            System.out.print("\n   seu nome é ");
            for (int j = 0; j < names; j++)
            { /* for each name */
                System.out.println("" + buffer[ptr]);
                ptr++;
            }
            System.out.println();
        }
    }

    private void pickItem(GL gl)
    {
        int[] selectBuf = new int[BUFSIZE];
        IntBuffer selectBuffer = BufferUtil.newIntBuffer(BUFSIZE);
        int hits;
        int viewport[] = new int[4];
        // int x, y;

        gl.glGetIntegerv(GL.GL_VIEWPORT, viewport, 0);

        gl.glSelectBuffer(BUFSIZE, selectBuffer);
        gl.glRenderMode(GL.GL_SELECT);

        gl.glInitNames();
        gl.glPushName(-1);

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glPushMatrix();
        gl.glLoadIdentity();
        /* create 5x5 pixel picking region near cursor location */
        glu.gluPickMatrix((double) pickPoint.x, (double) (viewport[3] - pickPoint.y), 5.0, 5.0, viewport, 0);
        gl.glOrtho(0.0, 8.0, 0.0, 8.0, -0.5, 2.5);
        drawRects(gl, GL.GL_SELECT);
        gl.glPopMatrix();
        gl.glFlush();

        hits = gl.glRenderMode(GL.GL_RENDER);
        selectBuffer.get(selectBuf);
        infoHits(hits, selectBuf);
    }

agradeço desde já

Em um tutorial só, não tem não. O ideal seria você ler os tutoriais ali do Ponto V em ordem, e ler um pouco sobre matrizes de transformação também.