void make3DNoiseTexture() { int f, i, j, k, inc; int startFrequency = 4; int numOctaves = 4; double ni[3]; double inci, incj, inck; int frequency = startFrequency; GLubyte* ptr; double amp = 0.5; Noise3DTexPtr = (GLubyte*) malloc(Noise3DTexSize * Noise3DTexSize * Noise3DTexSize * 4); for (f = 0, inc = 0; f < numOctaves; ++f, frequency *= 2, ++inc, amp *= 0.5) { SetNoiseFrequency(frequency); ptr = Noise3DTexPtr; ni[0] = ni[1] = ni[2] = 0; inci = 1.0 / (Noise3DTexSize / frequency); for (i = 0; i < Noise3DTexSize; ++i, ni[0] += inci) { incj = 1.0 / (Noise3DTexSize / frequency); for (j = 0; j < Noise3DTexSize; ++j, ni[1] += incj) { inck = 1.0 / (Noise3DTexSize / frequency); for (k = 0; k < Noise3DTexSize; ++k, ni[2] += inck, ptr += 4) *(ptr + inc) = (GLubyte) (((noise3(ni) + 1.0) * amp) * 128.0); } } } }
// // Create 3D noise texture // int CreateNoise3D(int unit) { int f,i,j,k,inc; unsigned int id; int numOctaves = 4; double ni[3]; double inci,incj,inck; int frequency = 4; double amp = 0.5; char* ptr; char pix[size * size * size * 4]; for (f=0,inc=0; f<numOctaves; f++,frequency*=2,inc++,amp*=0.5) { SetNoiseFrequency(frequency); ptr = pix; ni[0] = ni[1] = ni[2] = 0; inci = 1.0 / (size / frequency); for (i = 0; i < size; ++i, ni[0] += inci) { incj = 1.0 / (size / frequency); for (j = 0; j < size; ++j, ni[1] += incj) { inck = 1.0 / (size / frequency); for (k = 0; k < size; ++k, ni[2] += inck, ptr += 4) *(ptr + inc) = (char) (((noise3(ni) + 1.0) * amp) * 128.0); } } } // Select texture unit glActiveTexture(unit); // Generate 2D texture id and make current glGenTextures(1,&id); glBindTexture(GL_TEXTURE_2D,id); // Copy noise to texture glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, size, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, pix); // Set texture parameters glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT); glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Select texture unit glActiveTexture(GL_TEXTURE0); return id; }
void make3DNoiseTexture(void){ int f, i, j, k, inc; int startFrequency = 4; int numOctaves = 4; double ni[3]; double inci, incj, inck; int frequency = startFrequency; GLubyte *ptr; double amp = 0.5; if ((noise3DTexPtr = (GLubyte *) malloc(noise3DTexSize * noise3DTexSize * noise3DTexSize * 4)) == NULL) { fprintf(stderr, "ERROR: Could not allocate 3D noise texture\n"); exit(1); } for (f=0, inc=0; f < numOctaves; ++f, frequency *= 2, ++inc, amp *= 0.5) { SetNoiseFrequency(frequency); ptr = noise3DTexPtr; ni[0] = ni[1] = ni[2] = 0; inci = 1.0 / (noise3DTexSize / frequency); for (i=0; i<noise3DTexSize; ++i, ni[0] += inci) { incj = 1.0 / (noise3DTexSize / frequency); for (j=0; j<noise3DTexSize; ++j, ni[1] += incj) { inck = 1.0 / (noise3DTexSize / frequency); for (k=0; k<noise3DTexSize; ++k, ni[2] += inck, ptr+= 4) { *(ptr+inc) = (GLubyte) (((noise3(ni)+1.0) * amp)*128.0); } } } } }