3D纹理和过程纹理
过程纹理可以生成自然界中的很多图案,如模拟出云彩,大理石,木材。
一般都需要使用perlin noise函数,这个函数是连续的,因此图像的明暗
过渡是平滑的。
可以将过程纹理扩展到三维,这样就生成3D纹理,3D纹理是很费内存的。
用Opengl处理的代码如下:
1,创造3D纹理
glGenTextures(1, &texname);
glBindTexture(GL_TEXTURE_3D, texname);
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_T,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, WIDTH, HEIGHT, DEPTH, 0, GL_RGB, GL_UNSIGNED_BYTE,
tex); //tex是生成过程纹理的函数
2,生成纹理坐标
float xPlane[] = {1.0f, 0.0f, 0.0f, 0.0f};
float yPlane[] = {0.0f, 1.0f, 0.0f, 0.0f};
float zPlane[] = {0.0f, 0.0f, 1.0f, 0.0f};
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glTexGenfv(GL_S,GL_EYE_PLANE,xPlane);
glTexGenfv(GL_T,GL_EYE_PLANE,yPlane);
glTexGenfv(GL_R,GL_EYE_PLANE,zPlane);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glMatrixMode(GL_TEXTURE);
glEnable(GL_TEXTURE_3D);
glLoadIdentity();
glTranslatef(0.5f,0.5f,0.5f);
glScalef(0.5f,0.5f,0.5f);
glMultMatrixf(mat);//MODELVIEW matrix 转置矩阵
glEnable(GL_TEXTURE_3D);
glBindTexture(GL_TEXTURE_3D, texname);
glCallList(list);//模型列表