opengl纹理映射

 

主要是利用opengl函数实现位图到各种曲面的纹理映射。

下大概过程和相关函数

1.生成纹理对象

uint[] texture = new uint[n];

GL.glGenTextures(n,
this.texture);(c#)
void glGenTexture(Glsizei n, GLuint *texture);  (c++)

texture 是一个数组, 用于存储分配到的nID. 在调用一次 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   

posted @ 2011-08-12 21:20  书侍  阅读(565)  评论(0编辑  收藏  举报