OSG 学习第四天:自动生成纹理
2017-08-04 22:52
302 查看
OSG 光照和纹理
前言:学习新知识是一件痛苦且快乐的事。
一、自动生成纹理坐标
为了实现使用纹理贴图生成模型的轮廓线或者有光泽的模型对任意环境的反射,并不需要显示的指定纹理坐标,可以利用自动生成纹理坐标的机制处理。通常情况下,有多种自动生成纹理坐标的方法,不同的生成纹理坐标的方法有不同的用途。下面列举几种自动生成纹理坐标的模式:
OBJECT_LINEAR = GL_OBJECT_LINEAR;当纹理图像与移动的物体保持固定时,在物体坐标中指定参考平面是最为合适的。
EYE_LINEAR = GL_EYE_LINEAR; 为了实现移动物体的动态轮廓线,可以在视觉坐标中指定使用EYE_LINEAR。
SPHERE_MAP = GL_SPHERE_MAP; 用于球体环境贴图。
NORMAL_MAP = GL_NORMAL_MAP_ARB;
用于立方图纹理。
REFLECTION_MAP = GL_REFLECTION_MAP_ARB;
用于球体环境纹理。
有关二维纹理映射示例:
前言:学习新知识是一件痛苦且快乐的事。
一、自动生成纹理坐标
为了实现使用纹理贴图生成模型的轮廓线或者有光泽的模型对任意环境的反射,并不需要显示的指定纹理坐标,可以利用自动生成纹理坐标的机制处理。通常情况下,有多种自动生成纹理坐标的方法,不同的生成纹理坐标的方法有不同的用途。下面列举几种自动生成纹理坐标的模式:
OBJECT_LINEAR = GL_OBJECT_LINEAR;当纹理图像与移动的物体保持固定时,在物体坐标中指定参考平面是最为合适的。
EYE_LINEAR = GL_EYE_LINEAR; 为了实现移动物体的动态轮廓线,可以在视觉坐标中指定使用EYE_LINEAR。
SPHERE_MAP = GL_SPHERE_MAP; 用于球体环境贴图。
NORMAL_MAP = GL_NORMAL_MAP_ARB;
用于立方图纹理。
REFLECTION_MAP = GL_REFLECTION_MAP_ARB;
用于球体环境纹理。
有关二维纹理映射示例:
//2017.8.4 #include <osgViewer/Viewer> #include <osg/Node> #include <osg/Geode> #include <osg/Geometry> #include <osg/Group> #include <osg/Image> #include <osg/TexGen> #include <osg/Texture2D> #include <osg/TexEnv> #include <osg/StateSet> #include <osgDB/ReadFile> #include <osgDB/WriteFile> #include <osgUtil/Optimizer> //创建二维纹理属性 osg::ref_ptr<osg::StateSet> createTexture1DState() { osg::ref_ptr<osg::Image> image = osgDB::readImageFile("Images/primitives.gif"); //创建二维纹理 osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; //设置边界处理 texture->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::REPEAT); texture->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::REPEAT); //设置滤波 texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR); texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::NEAREST); //设置贴图 texture->setImage(image.get()); //设置自动纹理坐标,并指定相关的平面 osg::ref_ptr<osg::TexGen> texgen = new osg::TexGen; texgen->setMode(osg::TexGen::OBJECT_LINEAR); texgen->setPlane(osg::TexGen::S,osg::Plane(0.0f, 0.0f, 1.0f, 0.0f)); //创建属性集 osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet; //启用二维纹理 stateset->setTextureAttribute(0,texture.get(), osg::StateAttribute::OVERRIDE); stateset->setTextureMode(0, GL_TEXTURE_2D, osg::StateAttribute::ON| osg::StateAttribute::OVERRIDE); //启用纹理坐标生成器 stateset->setTextureAttribute(0, texgen.get(), osg::StateAttribute::OVERRIDE); stateset->setTextureMode(0, GL_TEXTURE_GEN_S, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); stateset->setTextureMode(0, GL_TEXTURE_GEN_T, osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE); return stateset.get(); } int main() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); osg::ref_ptr<osg::Group> root = new osg::Group(); osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cessna.osg"); //自动生成纹理坐标属性 osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet(); stateset = createTexture1DState(); node->setStateSet(stateset.get()); root->addChild(node.get()); //优化场景数据 osgUtil::Optimizer optimizer; optimizer.optimize(root.get()); //设置场景数据 viewer->setSceneData(root.get()); //初始化并创建窗口 viewer->realize(); //开始渲染 viewer->run(); return 0; }
相关文章推荐
- OpenGL学习二十二:纹理坐标自动生成
- osg 学习之十六:osgconv工具(android支持的纹理格式)
- Spring Boot学习笔记 - 整合Swagger2自动生成RESTful API文档
- Java学习笔记——doc文档自动生成方法
- OSG学习:自动对齐节点示例
- IntelliJ IDEA 学习笔记 - 自动生成 serialVersionUID
- 自动生成硬件优化内核:陈天奇等人发布深度学习编译器TVM
- OSG学习:多重纹理映射
- JOOQ 学习笔记一:代码自动生成
- [学习记录]Mysql使用TRIGGER自动生成订单号
- 深度学习之文本摘要自动生成
- [OpenGL]纹理坐标的自动生成glTexGen
- Spring MVC学习总结(9)——Spring MVC整合swagger自动生成api接口文档
- SpringMVC学习系列-后记 结合SpringMVC和Hibernate-validator,根据后台验证规则自动生成前台的js验证代码
- Effective c++学习笔记——条款6,不想自动生成函数,要明确拒绝
- springmvc学习笔记--mybatis--使用插件自动生成实体和mapper
- android学习二---解决ADT Buddle无法自动生成layout和res
- OpenGL--自动生成纹理坐标
- JFinal Web开发学习(四)数据库连接与自动生成model
- 《Effect C++》学习------条款06:若不想使用编译器自动生成的函数,就该明确拒绝