OpenSceneGraph和GLSL 330光影

时间:2014-06-18 16:51:03

标签: c++ opengl glsl openscenegraph

我写了很多

#version 330 core

GLSL着色器我想重复使用OpenSceneGraph(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框架填充它已经为“Drawables”维护的vbo,或者至少使用API​​调用并自己完成。

另外,我想通过场景图和访客填充灯具和阴影图的制服; SG中的“某处”和“某种方式”必须聚合光线和esp阴影信息进行默认着色,所以我只想使用这些数据并定制它以适合我的自定义着色器。

所以基本问题是

如何使用OSG中的数据填充任意 GLSL 330着色器,而不必重新发送冗余的统一分配 - 除了“手动”之外还手动提供“u [..] Matrix” osg _ [...]“由OSG设置的统一 - 或更改着色器源中的属性名称?

1 个答案:

答案 0 :(得分:1)

我偶然发现了this,事实证明,如果你只是指定布局位置,你可以使用你自己的名字(到目前为止我只尝试了顶点位置,所以你可能需要注意使用正确的布局位置,因为osg会指定它们,即顶点位置为0,法线为1(虽然未完成the example of the link))

layout (location = 0) in vec3 vertex;

这足以在着色器中使用名为vertex的变量。

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