osg shader 流动效果例子
时间: 2023-10-22 09:05:27 浏览: 182
以下是一个简单的 osg shader 流动效果例子:
```
osg::ref_ptr<osg::Shader> vertex_shader = new osg::Shader(osg::Shader::VERTEX, R"(
#version 330
uniform float time;
in vec3 vertex;
in vec3 normal;
out vec3 vNormal;
out vec3 vPosition;
void main() {
vec3 pos = vertex + normal * (sin(time * 10.0 + vertex.x) * 0.1);
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(pos, 1.0);
vNormal = normal;
vPosition = pos;
}
)");
osg::ref_ptr<osg::Shader> fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, R"(
#version 330
in vec3 vNormal;
in vec3 vPosition;
out vec4 fragColor;
void main() {
vec3 color = vec3(0.2, 0.5, 1.0);
float brightness = dot(normalize(vNormal), normalize(vec3(0.0, 0.0, 1.0)));
fragColor = vec4(color * brightness, 1.0);
}
)");
osg::ref_ptr<osg::Program> program = new osg::Program;
program->addShader(vertex_shader.get());
program->addShader(fragment_shader.get());
osg::ref_ptr<osg::Geometry> geometry = create_some_geometry();
geometry->getOrCreateStateSet()->setAttributeAndModes(program.get());
osg::ref_ptr<osg::Uniform> time_uniform = new osg::Uniform("time", 0.0f);
geometry->getOrCreateStateSet()->addUniform(time_uniform.get());
osg::ref_ptr<osg::AnimationPathCallback> anim_callback = new osg::AnimationPathCallback;
anim_callback->setAnimationPath(create_some_animation_path());
geometry->setUpdateCallback(anim_callback.get());
osgViewer::Viewer viewer;
viewer.setSceneData(geometry.get());
viewer.run();
```
这个例子中,我们使用了两个 osg::Shader 对象分别定义了一个顶点着色器和一个片元着色器。在顶点着色器中,我们使用了一个 time uniform 变量,来实现了一个简单的流动效果。在片元着色器中,我们使用了顶点的法向量和一个固定的颜色向量,计算出了最终的颜色值。我们将这两个 shader 绑定到一个 osg::Program 对象上,并将这个 program 设置到了一个 osg::Geometry 对象的状态集合中。最后,我们定义了一个 animation callback,将这个 geometry 对象插入到了场景图中,并启动了 osgViewer::Viewer 循环。
阅读全文