• 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   

  • 相关阅读:
    为什么写技术博客对新人如此重要?
    Javascript经典正则表达式
    关于读书的那些事,其实我一直...没有行动
    dede织梦CMS文件夹目录结构
    jQ初体验,^_^
    vi/vim 基本使用方法
    (X)HTML Strict 下的嵌套规则
    KISS保持简单:纪念丹尼斯·里奇
    关于jQuery性能优化
    编码规范CSSHTML 摘自kissyui
  • 原文地址:https://www.cnblogs.com/Jnshushi99/p/2136700.html
Copyright © 2020-2023  润新知