2014-06-18 87 views
2

我已经写了大量的 OpenSceneGraph的和GLSL 330光线和阴影

#version 330 core 

GLSL着色器,我想用OSG的(OSG)3.2.0架构重用一起,并尝试找出如何从我需要通过制服传入的OSG中获得状态,以及如何设置它们而不必更改经过充分测试的着色器代码,以及如何填充任意命名的属性。

此(140版本时,OpenGL 3.1) http://trac.openscenegraph.org/projects/osg/browser/OpenSceneGraph/trunk/examples/osgsimplegl3/osgsimplegl3.cpp

和这个(版本400) http://trac.openscenegraph.org/projects/osg/browser/OpenSceneGraph/trunk/examples/osgtessellationshaders/osgtessellationshaders.cpp

例如引起混叠某些属性和均匀的名称为 “osg_” 的概念,但我倒是喜欢用任意名字制服,

uniform mat4 uMVMatrix; 
/*...*/ 

,并指,还是让OSG参考,由他们的号码属性而已,所以某事像这样

/*...*/ 
layout(location = 0) in vec4 aPosition; 
layout(location = 1) in vec3 aNormal; 
layout(location = 2) in vec2 aST; 
在我的遗产着色器使用

,我想了OSG框架,它已经维持了“可绘制区域”,或VBO来填充,至少,使用API​​调用并自己做。

另外,我想通过场景图和访客填充灯光和shawdowmaps的制服, SG中的“某处”和“某种程度”必须将light和esp阴影信息汇总为默认阴影,所以我只想简单地使用这些数据并根据自己的自定义着色器进行调整。

因此,根本的问题是

如何从OSG内填充任意 GLSL 330个着色器与数据,而不必重新发送到冗余均匀分配 - 提供我的“U [..]黑客帝国”手动除到由OSG设置的“osg _ [...]”统一 - 或更改着色器源中的属性名称?

回答

0

我只是偶然发现了this,事实证明,你可以用你自己的名字毕竟,如果你只是指定布局位置(到目前为止我只试了顶点位置,所以你可能有照顾使用正确的布局位置为OSG将指定,在0即顶点位置,在1正常(未完成the example of the link虽然))的

layout (location = 0) in vec3 vertex; 

这就够用了着色器命名为顶点的变量。

该链接还提供了一个使用矩阵自定义名称的示例:您创建一个osg :: Uniform :: Callback类,将矩阵上传到统一。当你创建osg :: Uniform对象时,你指定你选择的名字并添加回调。