6.4.4 GLSL实现奶牛颜色动态变化

news2024/11/25 15:54:23
#include <osg/Program>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>

static const char* vertSource = {
    "varying vec3 normal;\n"//易变量 用于着色器之间的传值
    "void main()\n"
    "{\n"
    "    normal = normalize(gl_NormalMatrix * gl_Normal);\n" //把法线向量从物体空间转化到视觉空间。
    "    gl_Position = ftransform();\n" //相当于 gl_Position = ModelViewProjectionMatrix * gl_Vertex,
                                                //模型视图投影矩阵与空间顶点位置相乘,得到裁剪空间顶点位置。
    "}\n"
};

static const char* fragSource = {
    "uniform vec4 mainColor;\n"  //外面程序输入的颜色
    "varying vec3 normal;\n"    //上面的顶点着色器传的法线
    "void main()\n"
    "{\n"
    "    float intensity = dot(vec3(gl_LightSource[0].position), normal);\n" //计算光照位置与法线的点积,为什么这么做,知道的朋友不吝赐教下。
                                                                            //按照我的理解就是计算了一下亮度值。
    //给输出的颜色赋值
    "    if (intensity > 0.95) gl_FragColor = mainColor;\n" //如果这个值大于0.95,则输出颜色为mainColor,而uniform回调中每帧在来回改这个值,所
                                                            //以这一部分会出现闪烁的效果。
    "    else if (intensity > 0.5) gl_FragColor = vec4(0.6,0.3,0.3,1.0);\n"
    "    else if (intensity > 0.25) gl_FragColor = vec4(0.4,0.2,0.2,1.0);\n"
    "    else gl_FragColor = vec4(0.2,0.1,0.1,1.0);\n"
    "}\n"
};


/* 一直变量uniform回调类,主要用于每帧更新着色器中的用户数据,从而改变渲染的行为和输出结果。     */


class ColorCallback : public osg::Uniform::Callback
{
public:
    ColorCallback() : _incRed(false) {}

    virtual void operator()(osg::Uniform* uniform, osg::NodeVisitor* nv)
    {
        if (!uniform) return;

        osg::Vec4 color;
        uniform->get(color);//获取通过uniform 设置进去的值mainColor

        if (_incRed == true)//3、如果r减到0呢,就给他一直加。
        {
            if (color.x() < 1.0) color.x() += 0.1;
            else _incRed = false;//4、如果加到1就给他再减。
        }
        else
        {
            if (color.x() > 0.0) color.x() -= 0.1;//1、如果RGB中的r分量大于0,则一直减小。
            else _incRed = true;// 2、r减到0了。
        }
        uniform->set(color);
    }

protected:
    bool _incRed;
};

void createShaders(osg::StateSet& ss)
{
    osg::ref_ptr<osg::Shader> vertShader = new osg::Shader(osg::Shader::VERTEX, vertSource);
    osg::ref_ptr<osg::Shader> fragShader = new osg::Shader(osg::Shader::FRAGMENT, fragSource);

    osg::ref_ptr<osg::Program> program = new osg::Program;
    program->addShader(vertShader.get());
    program->addShader(fragShader.get());

    osg::ref_ptr<osg::Uniform> mainColor = new osg::Uniform("mainColor", osg::Vec4(0.5, 0.5, 0.5, 1.0));//这个部分的颜色是闪烁部分的颜色值。
    mainColor->setUpdateCallback(new ColorCallback);

    ss.addUniform(mainColor.get());
    ss.setAttributeAndModes(program.get());
}

int main(int argc, char** argv)
{
    osg::ArgumentParser arguments(&argc, argv);
    osg::Node* model = osgDB::readNodeFiles(arguments);
    if (!model) model = osgDB::readNodeFile("cow.osg");

    createShaders(*(model->getOrCreateStateSet()));

    osgViewer::Viewer viewer;
    viewer.setSceneData(model);
    viewer.setUpViewInWindow(20, 20, 600, 600);
    return viewer.run();
}

效果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kscan-简单的资产测绘工具

下载地址&#xff1a;https://github.com/lcvvvv/kscan 简介 &#xff1a; Kscan是一款纯go开发的全方位扫描器&#xff0c;具备端口扫描、协议检测、指纹识别&#xff0c;暴力破解等功能。支持协议1200&#xff0c;协议指纹10000&#xff0c;应用指纹20000&#xff0c;暴力破…

UNI-APP_subNVue原生子窗口使用,web-view层级问题解决

subNVues文档 app-subnvues文档 subNVues开发指南 需求&#xff1a;在pages/cloud_control/index页面使用subNVue原生子窗口 1.pages文件配置 "app-plus": {"bounce": "none","subNVues":[{"id": "control_popup&qu…

Mongodb基础及应用、部署(超详细)

目录 一、简介 二、应用场景 三、概念 四、安装部署 1、关闭防火墙和selinux 2、指定一个进程同一时间最多可开启的文件数 3、用户最多可开启的进程数目 4、安装版本下载地址 5、创建数据目录&#xff0c;日志文件及目录并创建相应配置文件 6、启动MongoDB数据库&#xff0c…

接口自动化你一定能要知道的基本流程和测试思路

接口自动化大致步骤&#xff1a; 1、发送请求 2、解析结果 3、验证结果 定义三个和业务相关的类 1、一个用来封装HTTPclient&#xff0c;用来发送请求 2、解析结果xml的类 3、一个用于比较测试结果和期望值的类&#xff0c;用于验证 4、自动生成报告的类&#xff1a;自…

Nerf-Wild代码学习笔记Neural Radiance Fields for Unconstrained Photo Collections

前言&#xff1a; 本文为记录自己在Nerf学习道路的一些笔记&#xff0c;包括对论文以及其代码的思考内容。公众号&#xff1a; AI知识物语 B站讲解&#xff1a;出门吃三碗饭 本篇文章主要针对其代码来学习其内容&#xff0c;关于代码的理解可能会有出入&#xff0c;欢迎批评指…

如何使用P-One的全链路压测工具来定位问题节点和分析性能问题

首先&#xff0c;简单介绍一下&#xff0c;性能测试平台P-One。 PerformanceOne&#xff08;简称&#xff1a;P-One&#xff09;是泽众软件自主研发的一套一站式性能测试平台软件产品。 该产品采用 B/S 架构开发&#xff0c;实现了集管理、设计、压测、监控以及分析于一体的全方…

(06)ATF代码导读之BL31

代码导读 关于平台相关的代码和函数均以qemu实现解读。 BL31 在BL2中触发安全监控模式调用后会跳转到BL31中执行&#xff0c;同理复位的入口函数为bl31_entrypoint。BL31最主要的两个功能&#xff1a;作为启动流程&#xff0c;初始化硬件和加载BL32、BL31等&#xff1b;启动…

scratch 角色移动

scratch 角色移动 这是本人的第一个scratch程序。入坑scratch是因为希望体验一下图形化编程并制作以动画为主的图形化程序。用的软件是Mind。Mind是由scratch改编的开源IDE&#xff0c;可以图形化开发Arduino程序&#xff0c;本人使用Mind的另一个原因是Mind提供快捷地在OLED屏…

【数据库】MySQL安装(最新图文保姆级别超详细版本介绍)

1.总共两部分&#xff08;第二部可省略&#xff09; 安装mysql体验mysql环境变量配置 1.1安装mysql 1.输入官网地址https://www.mysql.com/ 下载完成后&#xff0c;我们双击打开我们的下载文件 打开后的界面&#xff0c;如图所示 我们选择custom&#xff0c;点击nex…

ModaHub魔搭社区:腾讯云向量数据库为什么以独立产品形式推出?

自今年大模型趋势发生以来&#xff0c;向量数据库领域备受关注。 今年3月以后&#xff0c;多家向量数据库厂商拿下最新融资&#xff0c;其中Pinecone更是获得高达1亿美元的B轮融资。 腾讯云当然也注意到了这一趋势。 腾讯云数据库副总经理罗云表示&#xff0c;当时内部已经开…

华为OD机试真题 Java 实现【网上商城优惠活动(一)】【2022 Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、Java算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 某网上商城举办优惠活动&#xff0c;发布了满减、打折、无门槛3种优惠券&#xff0c;分别为&#xff1a; 1.每满100元优惠10元&#xff0c;无使用数限…

技术思维vs管理思维 程序员与项目经理5大思维差异

软件项目中&#xff0c;项目经理出身于程序员的情况较多&#xff0c;这样的项目经理在技术上拥有优势&#xff0c;但作为程序员的技术思维和作为项目经理的管理思维区别较大。因此如果不及时转换思维&#xff0c;往往造成过于纠结项目细节、忽视工期和成本压力&#xff0c;从而…

vmware虚拟机的12个使用技巧

1、增加虚拟机可用的物理内存 关闭虚拟机&#xff0c;设置内存&#xff1a; 2、硬件设备添加 一直选择下一步&#xff0c;直到这个界面进行磁盘大小分配&#xff1a; 3、控制权的切换 由于VMware的工作特点是在一台计算机中同时运行多个操作系统&#xff0c;因此这就存在一个…

排序算法-整理

1.【数据结构】带你玩转排序&#xff1a;堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序 【数据结构】带你玩转排序&#xff1a;堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序http://t.csdn.cn/fCXSo 2.十大基础算法 …

培训小程序首页开发

目录 1 定义变量2 欢迎语搭建3 分类导航搭建4 搭建底部导航总结 我们本篇来开发一下我们小程序的首页&#xff0c;先看一下原型 1 定义变量 因为我们首页展示的分类信息&#xff0c;现在分类信息已经存到了数据源里&#xff0c;我们要通过变量读取出来。 先打开我们创建的自…

Zabbix之部署

Zabbix 6.0 一.Zabbix介绍 1.zabbix 的含义 zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各…

matlab用histfit画直方图+拟合曲线

matlab画直方图拟合曲线 成图效果1 数据格式2 绘制步骤3 后话 成图效果 1 数据格式 应该准备一个double的数组&#xff0c;如果是csv或者xlsx直接拖进matlab是table型&#xff0c;这是无法作为绘图参数的 如果是table型&#xff0c;可以使用table2array(data)进行转换 2 绘制…

广东程序员,今年28岁,4年经验月薪13K,仍一事无成

之前认识的一位工作很努力的广州程序员朋友&#xff0c;前天深夜微信拍了拍我——“在吗&#xff1f;播妞”。 他把对未来的迷茫一股脑的倒了出来&#xff1a; 对方拍了拍你的“隐形翅膀” 我在&#xff01; 长夜漫漫无心睡眠&#xff0c;我以为只有我睡不着觉&#xff0c;…

Unity 之 超级详细的隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题 一&#xff0c;平台测试隐私问题二&#xff0c;解决方式一2.1 勾选自定义Mainifest2.2 修改自定义Mainifest2.3 隐私协议弹窗逻辑 三&#xff0c;解决方式二3.1 导出安卓工程3.2 创建上层Activity3.3 配置AndroidManifest 四&#xff0…

还在为PMO总结发愁?PMO工作总结应该怎么写及实例看这篇就够了

很多公司都要写总结了&#xff0c;作为PMO我们应该如何写工作总结呢&#xff1f;如何写总结能表现自己的价值还能让老板更喜欢看呢&#xff1f;过去一段时间的工作进行回顾总结&#xff0c;发掘问题、总结经验、进行规划等活动的过程。 今天分享给大家一个PMO写总结的方法和实…