__利用OpenGL对切片图像进行叠加构建三维图像是一个不错的选择。但是在图片叠加过程中必然会遇到多纹理映射,或许一个小小的错误或者几句代码顺序问题就会挡住我们追逐梦想的脚步,哈哈哈,好恶心。
__首先多纹理贴图第一步必然是纹理图片的加载。QImage的load()函数你值得拥有。然而只有load()肯定是不够的,一般的,我们会将图像的格式命名如Image1.bmp,Image2.bmp等有明显序列标识的文件名。`编程平台Qt+Win7+VS2013
QImage buf,tex[32];
QString s,filename;
for (int i = 1; i <= 31; i++)
{
s = QString::number(i, 10);
filename = "D:/chengxu/chengxu/GLWenLi/octdata_jiaomo/" + s + ".bmp";
if (!buf.load(filename))
{
qWarning("load image failed!");
QImage dummy(128, 128, QImage::Format_RGB32);
dummy.fill(Qt::green);
buf = dummy;
}
tex[i-1] = QGLWidget::convertToGLFormat(buf);//转换成OpenGL的图片格式
接下来就是生成纹理了`
glGenTextures(1, &textur[i - 1]);//返回一个未用的ID用来命名纹理图片
glBindTexture(GL_TEXTURE_2D, textur[i-1]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, tex[i-1].width(), tex[i - 1].height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex[i - 1].bits());//分配纹理图片的存储空间
//最后的两句一定要放在循环的内部,切记!!!!要不然总会只用到最后的一个纹理
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
对的,就是这一串。最终这段代码就产生了32个二维的纹理图。现在要做的就是将纹理的图片映射到32个面上。
int n = 32;
for (int i = 0; i < n;i++)
{
glBindTexture(GL_TEXTURE_2D, textur[i]);
glBegin(GL_QUADS);//注意这里的顺序,一定不要搞反了,这个问题熬了我一整天。
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, (GLfloat)i /n);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, (GLfloat)i / n);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, (GLfloat)i /n);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, (GLfloat)i /n);
glEnd();
}
就是这样。貌似很简单的样子,但是我遇到了几个小麻烦,很浪费时间,写出来大家共勉。
最后,在网上好像看到有大神说glGenTextures连续循环会遇到内存泄漏的问题。暂且不管了,慢慢进步吧。