主要是利用opengl函数实现位图到各种曲面的纹理映射。
说
下大概过程和相关函数
1.生成纹理对象
uint[] texture = new uint[n];
GL.glGenTextures(n, this.texture);(c#)
void glGenTexture(Glsizei n, GLuint *texture); (c++)
texture 是一个数组, 用于存储分配到的n个ID值. 在调用一次 glGenTextures() 后, 会将分配到的 ID 标识为'已用', 虽然直到绑定后才真正为'已用'. 分配3个纹理对象 ID:
unsigned int textureObjects[3]; glGenTexture(3, textureObjects);
2.设置纹理的一些属性
如何对上述分配的多个纹理对象进行一一的属性设置
GL.glBindTexture(GL.GL_TEXTURE_2D, this.texture[0]); GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGB, image.Width, image.Height, 0, GL.GL_BGR_EXT, GL.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
void glBindTexture(GLenum target, GLuint texture);
target 指定了纹理类型: GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP. texure 是你希望绑定的纹理对象的 ID.
一个被绑定的纹理对象直到被删除,或被另外的纹理对象绑定到 target 上才被解除绑定. 当一个纹理对象绑定到 target 上后, OpenGL 的后续的纹理操作都是基于这个纹理对象的。
上述的一段程序实现了对纹理对象1的属性设定:选定纹理对象1,设置纹理滤波方式,把载入的位图数据加入该纹理对象中。利用glBindTexture按照同样的方式完成其他纹理对象属性的设置。
3.将制定的纹理对象映射到相应的面上。
GL.glBindTexture(GL.GL_TEXTURE_2D, this.texture[0]); GL.glBegin(GL.GL_QUADS); for (int i=0; i < 44; i++ ) { for (int j=0; j < 44; j++ ) { float_x = (float)i/44.0f; float_y = (float)j/44.0f; float_xb = (float)(i+1)/44.0f; float_yb = (float)(j+1)/44.0f; GL.glTexCoord2f(float_x, float_y); GL.glVertex3f(this.points[i][j][0], this.points[i][j][1], this.points[i][j][2]); GL.glTexCoord2f(float_x, float_yb); GL.glVertex3f(this.points[i][j+1][0], this.points[i][j+1][1], this.points[i][j+1][2]); GL.glTexCoord2f(float_xb, float_yb); GL.glVertex3f(this.points[i+1][j+1][0], this.points[i+1][j+1][1], this.points[i+1][j+1][2]); GL.glTexCoord2f(float_xb, float_y); GL.glVertex3f(this.points[i+1][j][0], this.points[i+1][j][1], this.points[i+1][j][2]); } } GL.glEnd();
上段程序是NeHe http://nehe.gamedev.net/曲面纹理映射的代码实现思路:
载入如下的位图资源
将该位图数据赋给生成的纹理对象。
把该纹理对象分成44*44记录各个纹理坐标。
GL.glTexCoord2f(float_x, float_y);
GL.glVertex3f(this.points[i][j][0], this.points[i][j][1], this.points[i][j][2]);
按照如上方式:纹理坐标==实际空间坐标 对应 把该位图分成了44*44块映射到所需要映射的曲面上映射效果图如下
具体函数介绍可参考:http://www.cnblogs.com/sunliming/archive/2011/07/17/2108917.html