简体   繁体   中英

Cube mapping in OpenGL using DDS compressed images?

I am having trouble cube mapping when using a DDS cube map, I'm just getting a black cube which leads me to believe I have missing something simple, here's the code so far:

DDS_IMAGE_DATA *pDDSImageData = LoadDDSFile(filename);
//compressedTexture = -1;

if(pDDSImageData != NULL)
{
    int height = pDDSImageData->height;
    int width = pDDSImageData->width;
    int numMipMaps = pDDSImageData->numMipMaps;
    int blockSize;

    GLenum cubefaces[6] = {
        GL_TEXTURE_CUBE_MAP_POSITIVE_X,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
    };

    if( pDDSImageData->format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT )
        blockSize = 8;
    else
        blockSize = 16;
    glGenTextures( 1, &textureId ); int nSize;
    int nOffset = 0;
    glEnable(GL_TEXTURE_CUBE_MAP);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER,
        GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

    for(int face = 0; face < 6; face++)
    {
        for( int i = 0; i < numMipMaps; i++ )
        {
            if( width  == 0 ) width  = 1;
            if( height == 0 ) height = 1;
            glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_GENERATE_MIPMAP, GL_TRUE);
            nSize = ((width+3)>>2) * ((height+3)>>2) * blockSize;

            glCompressedTexImage2D(cubefaces[face] ,
                i,
                pDDSImageData->format,
                width,
                height,
                0,
                nSize,
                pDDSImageData->pixels + nOffset );


            nOffset += nSize;

            // Half the image size for the next mip-map level...
            width  = (width  / 2);
            height = (height / 2);
        }
    }
}

Once this code is called I bind the texture using glBindTexture and draw a cube using GL_QUADS and glTexCoord3f.

I'm get running my compressed dds-files with a cube. Your code is right, but have you layout your planes from your cube in the right orientation? Remember, you are IN the cube.

Try this in your display routine (in java):

gl.glEnable(GL2.GL_TEXTURE_CUBE_MAP);
gl.glBindTexture( GL2.GL_TEXTURE_CUBE_MAP, textureObjects[0] );
gl.glCullFace(GL2.GL_FRONT);

gl.glBegin(GL2.GL_QUADS);

// Negative-X Quad with map from Positive-X
// the veritices clockwise and the
// map counterclockwise 
gl.glTexCoord3f(  1.0f, -1.0f, 1.0f  );
gl.glVertex3f( -size, -size, size );
gl.glTexCoord3f( 1.0f, 1.0f, 1.0f  );
gl.glVertex3f( -size, size, size );
gl.glTexCoord3f(  1.0f, 1.0f, -1.0f  );
gl.glVertex3f( -size, size, -size );
gl.glTexCoord3f(  1.0f, -1.0f, -1.0f  );
gl.glVertex3f( -size, -size, -size );
/* ... */
gl.glEnd();  

gl.glCullFace(GL2.GL_BACK);
gl.glDisable(GL2.GL_TEXTURE_CUBE_MAP);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM