开发者

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_GENERAT开发者_运维百科E_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);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜