Exercise 2: 纹理
目录
二.体现使用不同的纹理滤波方式(GL_NEAREST,GL_LINEAR)对结果的影响
1.首先是GL_NEAREST方式,为了方便观察,我将三角形加大
2.在之后是GL_LINEAR方式,可以看出稍微“糊”了一点,但减少了锯齿感
三.使用超出1的纹理坐标,体现使用不同wrap参数(GL_REPEAT,GL_CLAMP)对结果的影响
四.理解纹理映射中的走样问题(为什么会产生走样?怎样减少走样?)
提示:以下是本篇文章正文内容,下面案例可供参考
一、在练习1的基础上,绘制一个带纹理的三角形
1.首先是纹理图像的载入
void LoadBMP()
{
FILE* pfile = fopen("brick.bmp", "rb");
if (pfile == 0) exit(0);
//读取图像大小
fseek(pfile, 0x0012, SEEK_SET);
fread(&imagewidth, sizeof(imagewidth), 1, pfile);
fread(&imageheight, sizeof(imageheight), 1, pfile);
//计算像素数据长度
pixellength = imagewidth * 3;
while (pixellength % 4 != 0)pixellength++;
pixellength *= imageheight;
//读取像素数据
pixeldata = (GLubyte*)malloc(pixellength);
if (pixeldata == 0) exit(0);
fseek(pfile, 54, SEEK_SET);
fread(pixeldata, pixellength, 1, pfile);
//关闭文件
fclose(pfile);
}
到此为止虽然可以读取出bmp图像的信息,但得到的结果却很奇怪,如图,获取到的颜色和原始的纹理图像不同
查询后得知bmp的编码格式为BGR,即Blue-Green-Red,和纹理所使用的RGB不同,还需添加如下代码:
//将每三个像素信息中的Blue和Red互换,得到RGB信息
for (int i = 0; i < pixellength; i += 3)
{
auto temp = pixeldata[i];
pixeldata[i] = pixeldata[i + 2];
pixeldata[i + 2] = temp;
}
2.OpenGL中基本纹理的使用
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //使用NEAREST滤波
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imagewidth, imageheight, 0, GL_RGB, GL_UNSIGNED_BYTE, pixeldata); //表面纹理函数
glEnable(GL_TEXTURE_2D); //启用2d纹理
glBegin(GL_TRIANGLES);
glTexCoord2f(0.0, 0.0); //指定三角形各点在纹理空间的坐标位置
glVe