The following is my partail code concern texture:
Create texture:
GLenum err = GL_OUT_OF_MEMORY;
m_iDivident = 0;
glGenTextures(1, &m_iTex3D);
glBindTexture(GL_TEXTURE_3D, m_iTex3D);
while (err == GL_OUT_OF_MEMORY)
{
m_iDivident++;
div_t div_layer = div(m_pData->numSlices[2], m_iDivident);
m_pData->volTexSizes[2] = div_layer.quot + div_layer.rem;
glTexImage3D(GL_TEXTURE_3D, 0, GL_COMPRESSED_ALPHA_ARB, m_pData->volTexSizes[0], m_pData->volTexSizes[1],
m_pData->volTexSizes[2], 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);
err = glGetError();
}
glTexEnvi(GL_TEXTURE_3D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Take place texture:
unsigned char *pchData = NULL;
int di, idz, idy, idx, iNum;
short nCT = 0;
iNum = 1;
div_t divPiece;
while (!pchData)
{
iNum++;
divPiece = div(m_pData->volTexSizes[2], iNum);
pchData = (unsigned char*)calloc(m_pData->volTexSizes[0] *
m_pData->volTexSizes[1] *
divPiece.quot+divPiece.rem), sizeof(unsigned char));
}
nCT = 0;
float fCon = 0.0625f;
NIL::CCubeCT* pCube = m_pData->volData;
GLenum err;
glBindTexture(GL_TEXTURE_3D, m_iTex3D);
for (int i = 0; i < iNum; i++)
{
di = 0;
int iLayerBegin = i*(divPiece.quot)*m_iDivident;
int iLayerEnd = (i+1)*(divPiece.quot*m_iDivident+divPiece.rem);
if (i == iNum-1)
{
iLayerEnd = m_pData->numSlices[2];
}
for (idz = iLayerBegin; idz < iLayerEnd; idz+=m_iDivident) {
for (idy = 0; idy < m_pData->numSlices[1]; ++idy) {
for (idx = 0; idx < m_pData->numSlices[0]; ++idx) {
nCT = pCube->GetFast(idx, idy, idz);
pchData[di] = (unsigned char)(nCT * fCon);
di++;
}
}
}
glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, i*divPiece.quot, m_pData->volTexSizes[0], m_pData->volTexSizes[1],
divPiece.quot+divPiece.rem, GL_ALPHA, GL_UNSIGNED_BYTE, pchData);
err = glGetError();
}
free(pchData);
Delete texture:
if (m_iTex3D)
{
glDeleteTextures(1, &m_iTex3D);
m_iTex3D = 0;
}