个人学习笔记
今天学纹理!!学不会不睡觉
chapter3.0:纹理
纹理映射的原理:
由于图片的长宽各不相同,所以设置宽高从0开始,1结束,便于插值。给我们想画的图形的每个顶点设置uv坐标,就可以通过 uv坐标*图片实际的长宽 来知道到底用图片的哪个点上的颜色
纹理环绕方式:当顶点uv坐标超出默认范围0-1时,选择不同的选项以获取不同的视觉效果输出。
纹理过滤:纹理像素低时采用的纹理过滤方式,GL_NEAREST和GL_LINEAR
texture unit:texture锚定点,用来分别指认很多纹理贴图,如GL_TEXTURE0-GL_TEXTURE15
实战:
在fragmentshader中调取,用纹理坐标找到像素,对输出颜色赋值
FragColor = texture(ourTexture, TexCoord);//通过texcoord纹理坐标,取出ourtexture这张图片中的对应像素点,赋值给fragcolor输出颜色
_pImage = ffImage::readFromFile("res/wall.jpg");//读取res文件夹中的wall图片当做纹理
glGenTextures(1, &_texture);//先生成
glBindTexture(GL_TEXTURE_2D, _texture);//再bind,平面纹理
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_MIN_FILTER, GL_NEAREST);//设置纹理采样方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _pImage->getWidth(), _pImage->getHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, _pImage->getData());
//读入,存储格式GL_RGBA,宽度,高度,传入图片数据
注:摘抄一段此文中的内容,可以解释为什么有时候纹理图在程序中显示为黑白色https://www.cnblogs.com/lookof/archive/2009/12/30/1636289.html
纹理图一般也是正方形,且边长应该满足2^N的规律,比如纹理图尺寸可以为4x4,8x8,16x16,… 512x512。 为什么纹理图是这样的规律?这是由于硬件的原因。把纹理图交给渲染API处理时,显卡硬件便接手此事。“纹理贴图”属于硬件渲染管线中的一个环节,而显卡做此操作时,要求提供的纹理图边长应该是2^N。
chapter3.1:空间
因为摄像机需要用到变换,所以下载一个相关的GLM 文件。具体操作见https://blog.csdn.net/Wonz5130/article/details/83116009
https://github.com/g-truc/glm/releases/tag/0.9.8.0