Текстура GLSL возвращает ноль после обновления OpenInventor с 9.8 до 10.4.2 - PullRequest
2 голосов
/ 25 февраля 2020

При обновлении нашего исходного кода с 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 всегда возвращает ноль. Раскомментирование gl_FragColor = vec4(coord.xy, 0, 1); дает тот же результат. Поэтому я предполагаю, что coord вычислено правильно.

Когда мы переходим с версии # 120 на # 410, я могу представить, что мне нужно сделать что-то еще, чтобы заставить texture работать в нашем фрагмент-шейдере. Были ли какие-либо соответствующие изменения в GLSL. Что мне нужно сделать, чтобы заставить шейдер работать?

Если необходимо, вот некоторая системная информация:

  • Операционная система: Windows 10
  • Графика плата: NVIDIA Quadro K2200

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Проблема здесь в вашем графике сцены, так как оба узла texture и textureUnit находятся под SoSeparator и не видны для shaderProgam , который находится вне SoSeparator местный Root. Пожалуйста, переместите эти узлы из local Root и добавьте их в качестве дочерних к узлу root для правильной визуализации.

Он работал для вас с Open Inventor 9.8 из-за ошибки, исправленной после Open Inventor 10. Надеюсь, что это поможет, и дайте нам знать, если проблема будет решена для вас.

В будущем, пожалуйста, не стесняйтесь обращаться в службу поддержки Open Inventor (FRBOR. 3d_hotline@thermofisher.com) с вашими вопросами.

2 голосов
/ 27 февраля 2020

По почте служба поддержки Open Inventor предложила другое решение, которое также работает:

Замените

SoSeparator* localRoot = new SoSeparator;

на

SoGroup* localRoot = new SoGroup;
...