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
是否有任何相关变化。我需要做什么才能让着色器工作?
如果相关,这里有一些系统信息:
- 操作系统:Windows 10
- 显卡:NVIDIA Quadro K2200
这里的问题出在您的场景图中,因为 texture 和 textureUnit 节点都在 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;
在将我们的源代码从 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
是否有任何相关变化。我需要做什么才能让着色器工作?
如果相关,这里有一些系统信息:
- 操作系统:Windows 10
- 显卡:NVIDIA Quadro K2200
这里的问题出在您的场景图中,因为 texture 和 textureUnit 节点都在 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;