[ogl] texture mapping - hello world
2009-04-19 17:43:48| 分类:
3d
| 标签:
|举报
|字号大中小 订阅
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 上的内容。
评论这张
转发至微博
转发至微博
评论