При обновлении нашего исходного кода с 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