1.绘制目标
- 练习基本的纹理映射,请实现如下纹理映射效果。
2.核心代码
// 处理加载进来的图像
Mat LoadImage(const string& fname, bool bAlpha = true)
{
if (bAlpha)
{
Mat img_bgra = imread(fname, IMREAD_UNCHANGED);
if (img_bgra.empty())
{
cout << "Failed load the image!" << endl;
return img_bgra;
}
flip(img_bgra, img_bgra, 0);
Mat img_rgba;
cvtColor(img_bgra, img_rgba, COLOR_BGRA2RGBA);
return img_rgba;
}
else
{
Mat img_bgr = imread(fname, IMREAD_COLOR);
if (img_bgr.empty())
{
cout << "Failed load the image!" << endl;
return img_bgr;
}
flip(img_bgr, img_bgr, 0);
Mat img_rgb;
cvtColor(img_bgr, img_rgb, COLOR_BGR2RGB);
return img_rgb;
}
}
// 加载外部的纹理图
void LoadExternalTexture()
{
// 加载纹理图
//Mat img_rgba = LoadImage("Brick.jpg", true);
//Mat img_rgba = LoadImage("smile.png", true);
Mat img_rgba = LoadImage("monkey.png", true);
// 绑定纹理图
glBindTexture(GL_TEXTURE_2D, TEXTURE_ID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img_rgba.size[1], img_rgba.size[0], 0, GL_RGBA, GL_UNSIGNED_BYTE, img_rgba.data);
// 设置纹理平铺属性
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_NEAREST);
}
void init() {
glClearColor(1.f, 1.f, 1.f, 0.f);
// 创建纹理图ID
glGenTextures(1, &TEXTURE_ID);
// 加载纹理图
LoadExternalTexture();
// 设置纹理环境
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// 开启纹理映射
glEnable(GL_TEXTURE_2D);
}
void NewFunction5_1()
{
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0.f, 1.f); glVertex2f(-160.f, 150.f);
glTexCoord2f(0.f, 0.f); glVertex2f(-160.f, -150.f);
glTexCoord2f(0.5f, 1.f); glVertex2f(0.f, 150.f);
glTexCoord2f(1.0f, 0.f); glVertex2f(120.f, -150.f);
glTexCoord2f(1.f, 0.5f); glVertex2f(160.f, 0.f);
glEnd();
}
3.运行结果