cocos2D-X源码分析之从cocos2D-X学习OpenGL(12)----立方体贴图和天空盒

cocos2D-X源码分析之从cocos2D-X学习OpenGL(12)----立方体贴图和天空盒,第1张

概述      本篇介绍3d游戏中的天空盒概念,天空盒就是游戏中的背景,它是一个包裹整个场景的立方体,它由六个图像构成一个环绕的环境,给玩家一种所在场景比实际上大得多的感觉,如下图所示。        创建天空盒的方法和创建其他节点一样调用create函数,那我们看看create函数里到底做了什么? bool Skybox::init(const std::string& positive_x, co

本篇介绍3d游戏中的天空盒概念,天空盒就是游戏中的背景,它是一个包裹整个场景的立方体,它由六个图像构成一个环绕的环境,给玩家一种所在场景比实际上大得多的感觉,如下图所示。


创建天空盒的方法和创建其他节点一样调用create函数,那我们看看create函数里到底做了什么?

bool SkyBox::init(const std::string& positive_x,const std::string& negative_x,const std::string& positive_y,const std::string& negative_y,const std::string& positive_z,const std::string& negative_z){    auto texture = TextureCube::create(positive_x,negative_x,positive_y,negative_y,positive_z,negative_z);    if (texture == nullptr)        return false;        init();    setTexture(texture);    return true;}
这里调用了TextureCube这个类,这个类就是立方体贴图,立方体贴图就是6个2D纹理,每个2D纹理是立方体的一个面,绑定一个立方体纹理需要调用下面的函数:
GL::bindTextureN(0,_name,GL_TEXTURE_CUBE_MAP);
由于6个纹理,我们需要调用glTexImage2D六次,openGL提供了六个纹理目标,如下:


和其他openGL枚举一样,它的int值也是每次加一的,所以我们可以用如下的方式设置纹理:

for (int i = 0; i < 6; i++)    {        Image* img = images[i];        Texture2D::PixelFormat  ePixelFmt;        unsigned char*          pData = getimageData(img,ePixelFmt);        if (ePixelFmt == Texture2D::PixelFormat::RGBA8888 || ePixelFmt == Texture2D::PixelFormat::DEFAulT)        {            glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,// level                         GL_RGBA,// internal format                         img->getWIDth(),// wIDth                         img->getHeight(),// height                         0,// border                         GL_RGBA,// format                         GL_UNSIGNED_BYTE,// type                         pData);             // pixel data        }        else if (ePixelFmt == Texture2D::PixelFormat::RGB888)        {            glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,// level                         GL_RGB,// border                         GL_RGB,// type                         pData);             // pixel data        }        if (pData != img->getData())            delete[] pData;    }
其他的纹理设置和之前的2D纹理设置一样,这样就创建了立方体贴图

在cocos2d-x中创建天空盒的方式也是定义六个面的贴图就可以:

    //立方体贴图shader    auto shader = GLProgram::createWithfilenames("Sprite3DTest/cube_map.vert","Sprite3DTest/cube_map.frag");    auto state = GLProgramState::create(shader);        //创建立方体纹理    _textureCube = TextureCube::create("Sprite3DTest/skyBox/left.jpg","Sprite3DTest/skyBox/right.jpg","Sprite3DTest/skyBox/top.jpg","Sprite3DTest/skyBox/bottom.jpg","Sprite3DTest/skyBox/front.jpg","Sprite3DTest/skyBox/back.jpg");    //立方体纹理参数    Texture2D::TexParams tRepeatParams;    tRepeatParams.magFilter = GL_liNEAR;    tRepeatParams.minFilter = GL_liNEAR;    tRepeatParams.wrapS = GL_MIRRORED_REPEAT;    tRepeatParams.wrapT = GL_MIRRORED_REPEAT;    _textureCube->setTexParameters(tRepeatParams);        //设置uniform    state->setUniformTexture("u_cubeTex",_textureCube);        //创建天空盒    _skyBox = SkyBox::create();    _skyBox->setCameraMask(s_CM[LAYER_BACKGROUND]);    _skyBox->setTexture(_textureCube);    _skyBox->setScale(700.f);
能力不足,水平有限,如有错误,欢迎指出。 总结

以上是内存溢出为你收集整理的cocos2D-X源码分析之从cocos2D-X学习OpenGL(12)----立方体贴图和天空盒全部内容,希望文章能够帮你解决cocos2D-X源码分析之从cocos2D-X学习OpenGL(12)----立方体贴图和天空盒所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1080198.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存