注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[ogl] texture mapping - hello world  

2009-04-19 17:43:48|  分类: 3d |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
texture mapping 就是把图片上的内容,映射到所绘制的三角形上,一般称为纹理/贴图。
下面是 red book 里的小例子:
--------------------------------------------------
#define    SCREEN_WIDTH    640
#define    SCREEN_HEIGHT    480

#define    TEX_WIDTH        64
#define    TEX_HEIGHT        64

static GLubyte mytex[TEX_HEIGHT][TEX_WIDTH][4];
static GLuint  texName;

//
// Init GL
//
void InitTexture(void)
{
    int i, j, c;
    for ( i = 0; i < TEX_HEIGHT; i++ )
    {
        for ( j = 0; j < TEX_WIDTH; j++ )
        {
            c = ((((i&0x8)==0)^(j&0x8)==0))*255;
            mytex[i][j][0] = (GLubyte) c;
            mytex[i][j][1] = (GLubyte) c;
            mytex[i][j][2] = (GLubyte) c;
            mytex[i][j][3] = (GLubyte) 255;
        }
    }
}

void InitGL(void)
{
    // set camera
    glViewport(0, 0, (GLsizei) SCREEN_WIDTH, (GLsizei) SCREEN_HEIGHT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (GLfloat) SCREEN_WIDTH / (GLfloat) SCREEN_HEIGHT, 1.0, 30.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -3.6);

    glClearColor(0.5, 0.5, 0.5, 0.0);
    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);

    InitTexture();
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glGenTextures(1, &texName);
    glBindTexture(GL_TEXTURE_2D, texName);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, mytex);
}

void RenderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glBindTexture(GL_TEXTURE_2D, texName);

    glBegin(GL_QUADS);
        glTexCoord2f(-1.0, -1.0);        glVertex3f(-2.0, -1.0, 0.0);
        glTexCoord2f(-1.0, 2.0);        glVertex3f(-2.0, 1.0, 0.0);
        glTexCoord2f(2.0, 2.0);        glVertex3f(0.0, 1.0, 0.0);
        glTexCoord2f(2.0, -1.0);        glVertex3f(0.0, -1.0, 0.0);
        glTexCoord2f(0.0, 0.0);        glVertex3f(1.0, -1.0, 0.0);
        glTexCoord2f(0.0, 1.0);        glVertex3f(1.0, 1.0, 0.0);
        glTexCoord2f(1.0, 1.0);        glVertex3f(2.41421, 1.0, -1.41421);
        glTexCoord2f(1.0, 0.0);        glVertex3f(2.41421, -1.0, -1.41421);
    glEnd();
    glFlush();
    glDisable(GL_TEXTURE_2D);
}
----------------------------------------------------

glPixelStorei() 会影响很多函数读取内存数据的行为,比如 byte-order 等等。具体影响了哪些,还不太明了。

GL_TEXTURE_1D/2D/3D 等,GL 中称为 texture target,而 glTexParameter() / glTexImage2D 这些函数,都是修改某个 target 的设定。
    glGenTextures(1, &texName);
    glBindTexture(GL_TEXTURE_2D, texName);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    ...
就相当于:
    static struct tex_s *2D_tex;
    texName = malloc(struct tex_s);        // glGenTextures
    2D_tex = texName;                            // glBindTexture
    2D_tex.xx =??;                                   // glTexParameter, ...
    2D_tex.yy = ??;                                  // glTexImage2D, ...
GL 中,很多函数都是依赖当前的“环境/状态”的,这里 texture 就是典型的例子。因为不像 D3D 那样有 object/interface 的概念,可以用 OO 的方式来设置信息:
    texName = new 2DTexObj;
    texName->SetTexParameter()
    texName->SetImage2D()

对于 tex coord,默认映射到 [0.0, 1.0] 这个区间。而 glTexParameter() 中的 GL_TEXTURE_WRAP_S / GL_TEXTURE_WRAP_T 决定了对 texture 中进行索引时的行为,比如 GL_REPEAT 就是只是用 coord 的小数部分,-0.5, 0.5, 1.5 都是选取到 0.5 这个位置。

glTexEnv() 可以设置 texture mapping 过程中的一些行为,GL_TEXTURE_ENV_MODE = GL_REPLACE,就是用 tex 上的内容作为 src pixel,完全替代 dst pixel 上的内容。
  评论这张
 
阅读(905)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017