OpenInventor 从 9.8 升级到 10.4.2 后 GLSL 纹理 returns 为零

GLSL texture returns zero after OpenInventor upgrade from 9.8 to 10.4.2

在将我们的源代码从 OpenInventor 9.8 升级到 10.4.2 时,我遇到片段着色器中计算的某些颜色在 10.4.2 中始终为黑色,而在 9.8 中一切正常。通常我们使用自己的计算纹理,但出于调试目的,我使用了 OpenInventor 示例中的示例纹理:

SoSwitch* root = new SoSwitch;
// Fill root with geometry
root->addChild(...)

SoSeparator* localRoot = new SoSeparator;
SoFragmentShader* fragShader = new SoFragmentShader;
SoShaderProgram* shaderProgram = new SoShaderProgram;

SoTexture2 texture = new SoTexture2;
texture->filename = "pathToImage\image.png"

SoTextureUnit textureUnit = new SoTextureUnit;
texture Unit->unit = 1;

localRoot->addChild(textureUnit);
localRoot->addChild(texture);

fragShader->addShaderParameter1i("myTexture", 1);
shaderProgram->shaderObject.set1Value(1, fragShader);

root->addChild(localRoot);
root->addChild(shaderProgram);

这是适用于 9.8 的片段着色器:

#version 120
uniform sampler2D myTexture;
in vec3 coord; // Computed in vertex-shader
int main() {
    gl_FragColor = texture2D(myTexture, coord.xy);
    // For Debugging:
    // gl_FragColor = vec4(coord.xy, 0, 1);
}

这是不能与 10.4.2 一起工作的片段着色器:

#version 410 compatibility
//!oiv_include <Inventor/oivShaderState.h>
//!oiv_include <Inventor/oivShapeAttribute.h>
//!oiv_include <Inventor/oivShaderVariables.h>
uniform sampler2D myTexture;
in vec3 coord;
int main() {
    OivFragmentOutput(texture(myTexture, coord.xy)); // Is the same as gl_FragColor = 
    // For Debugging:
    // gl_FragColor = vec4(coord.xy, 0, 1);
}

查看器保持完全黑色,因此我假设对 texture returns 的调用始终为零。 取消注释 gl_FragColor = vec4(coord.xy, 0, 1); 会得到相同的结果。因此我假设 coord 计算正确。

当我们从版本 #120 跳到 #410 时,我可以想象我需要做一些其他事情才能让 texture 在我们的片段着色器中工作。 GLSL 是否有任何相关变化。我需要做什么才能让着色器工作?

如果相关,这里有一些系统信息:

这里的问题出在您的场景图中,因为 texturetextureUnit 节点都在 SoSeparator 下并且对 shaderProgam,它在SoSeparatorlocalRoot之外。请将这些节点移出 localRoot,并将它们作为子节点添加到 root 节点以正确呈现。

由于自 Open Inventor 10 以来已修复的错误,它适用于 Open Inventor 9.8。希望这对您有所帮助,如果问题已为您解决,请告诉我们。

以后,如有任何问题,请随时联系 Open Inventor 支持 ( FRBOR.3d_hotline@thermofisher.com)。

通过邮件,Open Inventor 支持人员提出了另一个同样有效的解决方案:

替换

SoSeparator* localRoot = new SoSeparator;

SoGroup* localRoot = new SoGroup;