opengl - 如何在3d不规则物体上放置纹理

时间:2013-04-16 19:16:38

标签: c++ opengl 3d glut

我必须制作动画,其中加特林枪将被射击(它不一定是复杂的,因为它只是一种练习)。我画了我的枪的基本版本,看起来像这样:

Gatling gun

不要打扰颜色 - 我让它们像那样能够看到枪的特定部位的哪个部分。现在我想通过使用一些纹理 - 摩洛或类似金属色 - example 1example2来使它看起来更好。我知道如何加载纹理以及如何将它用于2d对象,但我不知道是否有可能将此纹理用于我的整个绘图,或者我是否必须分别对每个部分使用纹理?这是我的代码,它对应于来自bmp文件的加载纹理,并使其能够使用:

void initTexture(string fileName)
{
    loadBmp(fileName.c_str());
    textureId = 13;
    glBindTexture(GL_TEXTURE_2D, textureId); //Tell OpenGL which texture to edit
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    //Map the image to the texture
    glTexImage2D(GL_TEXTURE_2D,                //Always GL_TEXTURE_2D
                 0,                            //0 for now
                 GL_RGB,                       //Format OpenGL uses for image
                 tex.info.biWidth, tex.info.biHeight,  //Width and height
                 0,                            //The border of the image
                 GL_RGB, //GL_RGB, because pixels are stored in RGB format
                 GL_UNSIGNED_BYTE, //GL_UNSIGNED_BYTE, because pixels are stored
                                   //as unsigned numbers
                 tex.px);               //The actual pixel data

}

loadBmp()是加载位图文件的函数。我试图在互联网和stackoverflow中搜索一些东西,但所有关于立方体或球体的exmaples都没有帮助我。如何在此图纸上放置纹理?

1 个答案:

答案 0 :(得分:1)

纹理映射需要(手动)为每个顶点指定纹理坐标。有一些方法可以自动纹理坐标生成,或者在没有纹理坐标的情况下通过为每个面部提供一个单独的像素来消失(迪士尼动画公司开创了后来的计算机动画电影方法)。

由于您没有指定您用于建模的程序,因此我将向您介绍一些关于Blender纹理UV贴图的教程

http://wiki.blender.org/index.php/Doc:2.6/Manual/Textures/Mapping/UV/Unwrapping

请不要告诉我你做了“编码”你的枪,因为这是错误的,错误的,错误的!

获得纹理坐标后,将它们作为另一个顶点属性传递给OpenGL。