Search code examples
javaopenglmemory-leaksrendertextures

openGL / JOGL: Why do some Textures render "Smoothed" and some not?


The following code is the method to render a single cube in my JOGL practice app:

        public void render(GL gl)
        {
            texture.enable();

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

            texture.bind(); // textures clockwise from top left when
            // facing

            gl.glBegin(GL.GL_QUADS);

            // north facing side
            if (renderSide[0])
                {
                    gl.glNormal3i(0, 1, 0);
                    gl.glTexCoord2f(0.0f, 0.0f);
                    gl.glVertex3fv(v2, 0);
                    gl.glTexCoord2f(1.0f, 0.0f);
                    gl.glVertex3fv(v1, 0);
                    gl.glTexCoord2f(1.0f, 1.0f);
                    gl.glVertex3fv(v5, 0);
                    gl.glTexCoord2f(0.0f, 1.0f);
                    gl.glVertex3fv(v6, 0);
                }
            // east facing side
            if (renderSide[1])
                {
                    gl.glNormal3i(1, 0, 0);
                    gl.glTexCoord2f(0.0f, 0.0f);
                    gl.glVertex3fv(v3, 0);
                    gl.glTexCoord2f(1.0f, 0.0f);
                    gl.glVertex3fv(v2, 0);
                    gl.glTexCoord2f(1.0f, 1.0f);
                    gl.glVertex3fv(v6, 0);
                    gl.glTexCoord2f(0.0f, 1.0f);
                    gl.glVertex3fv(v7, 0);
                }
            // south facing side
            if (renderSide[2])
                {
                    gl.glNormal3i(0, -1, 0);
                    gl.glTexCoord2f(0.0f, 0.0f);
                    gl.glVertex3fv(v4, 0);
                    gl.glTexCoord2f(1.0f, 0.0f);
                    gl.glVertex3fv(v3, 0);
                    gl.glTexCoord2f(1.0f, 1.0f);
                    gl.glVertex3fv(v7, 0);
                    gl.glTexCoord2f(0.0f, 1.0f);
                    gl.glVertex3fv(v8, 0);
                }
            // west facing side
            if (renderSide[3])
                {
                    gl.glNormal3i(-1, 0, 0);
                    gl.glTexCoord2f(0.0f, 0.0f);
                    gl.glVertex3fv(v1, 0);
                    gl.glTexCoord2f(1.0f, 0.0f);
                    gl.glVertex3fv(v4, 0);
                    gl.glTexCoord2f(1.0f, 1.0f);
                    gl.glVertex3fv(v8, 0);
                    gl.glTexCoord2f(0.0f, 1.0f);
                    gl.glVertex3fv(v5, 0);
                }
            // top side
            if (renderSide[4])
                {
                    gl.glNormal3i(0, 0, 1);
                    gl.glTexCoord2f(0.0f, 0.0f);
                    gl.glVertex3fv(v1, 0);
                    gl.glTexCoord2f(1.0f, 0.0f);
                    gl.glVertex3fv(v2, 0);
                    gl.glTexCoord2f(1.0f, 1.0f);
                    gl.glVertex3fv(v3, 0);
                    gl.glTexCoord2f(0.0f, 1.0f);
                    gl.glVertex3fv(v4, 0);
                }

            gl.glEnd();
            texture.disable();

This code is called for every Cube, which are each initialised identically, however the texture for some is treated differently and 'blurred', while the rest are not,

Here is an image: Top left is wrong!!

This render method is called every frame for each block, so how is it that the problem manifest's itself for a single block permanently?

Also as a side question, my app as it is has a substantial memory leak I cannot track down, is the problem here? other than setting the camera and light sources this is the majority of the OpenGL code!


Solution

  • GL_TEXTURE_MAG_FILTER is per-texture-object state. Bind your texture object, then set it.