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

news/2024/12/5 10:48:38/
#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 设置进去的值mainColorif (_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.ppmy.cn/news/741752.html

相关文章

Netty中的bytebuf使用直接内存和池化技术的意义在哪,以及具体的使用场景

一&#xff0c;使用直接内存的意义&#xff1a; 使用直接内存&#xff0c;可以避免用户态的数据拷贝&#xff0c;举例&#xff0c;比如我们在netty中通过 ByteBuf directBuffer allocator.directBuffer(); 创建的bytebuf是基于直接内存的&#xff0c;我们往其中写入数据&…

多态的理解

多态 举例&#xff1a;现实中&#xff0c;学生是人的一种&#xff0c;则一个具体的同学张三既是学生也是人&#xff0c;即出现两种形态。 java作为面向对象的语言&#xff0c;同样可以描述一个事物的多种形态。如student类继承了person类&#xff0c;一个student对象既是stud…

打造品牌影响力:媒介易引领邀请明星录制祝福视频新潮流

在当今品牌推广的竞争激烈市场中&#xff0c;与体育冠军合作代言已成为众多品牌争相追求的新形式。体育冠军以其卓越的成就和广泛的影响力&#xff0c;成为品牌推广中的瞩目焦点。他们的形象和声音能够深入人心&#xff0c;激发消费者的共鸣&#xff0c;并对品牌产生积极的影响…

PR 不能手动修改素材尺寸的解决方法

选中素材&#xff0c;然后再特效控制台那边点击一下运动就可以在预览窗口直接用鼠标调整画面大小和位移了。 转载于:https://www.cnblogs.com/flipped/p/5210834.html

PR视频剪辑

PR视频剪辑 混剪补帧遇到的问题音频 混剪 确定视频故事主要脉络选择切合视频的音乐收集素材将主体故事高潮部分的素材放到音乐高潮处故事其他部分按照故事的脉络平铺开来注意最好放入有人声的部分&#xff0c;尽量与节奏契合无人声的部分使用绚丽&#xff0c;吸引眼球的素材填…

pr怎么导出预设_怎样用Pr导出清晰度高的视频?

有时,总觉视频的清晰度不够,如何导出高清晰度的视频呢? 一哥认为,重要的5个参数是:分辨率、比特率、帧速率、场序、格式。 分辨率和帧速率在序列设置的时候设置,比特率和格式、场序在导出视频时设置。 其中比特率是关键,分辨率不变的情况下,比特率越高越清晰。 —— 关…

【Pr】如何在预览的时候预渲染视频

我们打开PR&#xff0c;导入素材 我们给视频一些效果 可以在编辑轨道里看到&#xff0c;添加效果的位置都是红色的了&#xff0c;代表计算量大 预览的时候就很卡&#xff0c;这个时候在这段添加出入点 然后点击软件菜单栏的“序列”选择渲染入点和出点

d2l_第九章_RNN循环神经网络

x.1 Sequence model 经过前面的学习&#xff0c;我们已知数据大于算法。而以数据为驱动的前提下&#xff0c;我们提出了各种模型。为了适配表格数据&#xff0c;提出了MLP&#xff1b;为了适配图像数据提出了CNN&#xff1b;而对了适配序列数据&#xff0c;我们提出了RNN。 目…