OpenGL & GLSL训练(二)

Exercise 2: 纹理

目录

一、在练习1的基础上,绘制一个带纹理的三角形

1.首先是纹理图像的载入

2.OpenGL中基本纹理的使用

二.体现使用不同的纹理滤波方式(GL_NEAREST,GL_LINEAR)对结果的影响

1.首先是GL_NEAREST方式,为了方便观察,我将三角形加大

2.在之后是GL_LINEAR方式,可以看出稍微“糊”了一点,但减少了锯齿感

三.使用超出1的纹理坐标,体现使用不同wrap参数(GL_REPEAT,GL_CLAMP)对结果的影响

1.使用GL_REPEAT

2.使用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值