Opengl实现纹理贴图

xiaoxiao2021-02-28  58

纹理贴图的步骤

创建纹理对象,并为它指定一个纹理确定纹理如何应用到每个像素上启用纹理贴图功能绘制场景,提供纹理坐标和几何图形坐

Tips:纹理坐标必须在RGBA模式下才能使用,在颜色索引模式下是未定义的行为

一、创建纹理对象,并为它指定一个纹理

static GLuint texName;

glGenTextures(1, &texName); //创建1个纹理对象,&texName指向纹理索引

glBindTexture(GL_TEXTURE_2D, texName);//绑定纹理:改变OpenGL状态,使得后续的纹理操作都对texName指向的2D纹理生效

二、确定纹理如何应用到每个像素上

1.OpenGL——纹理过滤函数glTexParameteri()       图象从纹理图象空间映射到帧缓冲图象空间(映射需要重新构造纹理图像,这样就会造成应用到多边形上的图像失真),这时就可用glTexParmeteri()函数来确定如何把纹理象素映射成像素.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);GL_TEXTURE_2D: 操作2D纹理. GL_TEXTURE_WRAP_S: S方向上的贴图模式. GL_CLAMP: 将纹理坐标限制在0.0,1.0的范围之内.如果超出了会如何呢.不会错误,只是会边缘拉伸填充.         GL_TEXTURE_MAG_FILTER: 放大过滤 GL_LINEAR: 线性过滤, 使用距离当前渲染像素中心最近的4个纹素加权平均值. GL_TEXTURE_MIN_FILTER: 缩小过滤

GL_LINEAR_MIPMAP_NEAREST: 使用GL_NEAREST对最接近当前多边形的解析度的两个层级贴图进行采样,然后用这两个值进行线性插值.

2.为纹理对象指定一个纹理

glTexImage2D(GL_TEXTURE_2D,        //target,目标纹理0,               //分辨率级数参数,默认为0GL_RGBA,               //纹理单元格式checkImageWidth,      //纹理图像的宽checkImageHeight,     //纹理图像的高0,               //纹理图像边框的宽度,0或1GL_RGBA,                     //纹理像素数据的格式GL_UNSIGNED_BYTE, //像素数据类型checkImage               //内存中指向纹理图像的指针

);

三、启用纹理贴图功能

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清理缓存 glEnable(GL_TEXTURE_2D);//启用纹理贴图 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//指定纹理贴图与材质的混合模式 glBindTexture(GL_TEXTURE_2D, texName);//绑定纹理 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

四、绘制场景,提供纹理坐标和几何图形坐标

glBegin(GL_QUADS);    glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);    glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);    glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);    glTexCoord2f(1.0, 0.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);

转载请注明原文地址: https://www.6miu.com/read-2624020.html

最新回复(0)