OpenSceneGraph and GLSL 330 light and shadows

OpenSceneGraph and GLSL 330 light and shadows

本文关键字:and shadows light GLSL OpenSceneGraph      更新时间:2023-10-16

我写了很多

#version 330 core

GLSL着色器我想与OpenSceneGraph (OSG) 3.2.0框架一起重用,并试图弄清楚如何从OSG中获得我需要通过制服传递的状态,以及如何设置它们而无需更改经过良好测试的着色器代码,以及如何填充任意命名的属性。

This (version 140, OpenGL 3.1)http://trac.openscenegraph.org/projects/osg/browser/OpenSceneGraph/trunk/examples/osgsimplegl3/osgsimplegl3.cpp

和this (version 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中的"某处"answers"某种程度上"必须有光和特别是阴影信息被聚合为默认着色,所以我想简单地喜欢使用这些数据并调整它以适合我的自定义着色器。

所以基本问题是

如何用OSG内部的数据填充任意 GLSL 330着色器,而不必重新分配冗余的统一分配-提供我的"u[..]矩阵"手动除"osg_[…]由OSG统一设置-或者改变着色器源中的属性名称?

我只是偶然发现了这一点,事实证明,你可以使用你自己的名字毕竟,如果你只是指定布局位置(到目前为止,我只尝试了顶点位置,所以你可能要注意使用正确的布局位置osg会指定他们,即顶点位置为0,正常为1(这不是做的例子链接虽然))

layout (location = 0) in vec3 vertex;

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

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