首页 文章

OpenSceneGraph和GLSL 330光影

提问于
浏览
2

我写了很多

#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_"的概念,但是我想使用 arbitrary 名称来制服,

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中的数据填充 arbitrary GLSL 330着色器,而不必重新发送冗余的统一分配 - 除了OSG设置的"osg_[...]"统一外,手动提供我的"u[..]Matrix" - 或者更改着色器源中的属性名称?

1 回答

  • 0

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

    layout (location = 0) in vec3 vertex;
    

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

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

相关问题