SceneKit: геометрия не видна за полупрозрачной текстурой. Коробка внутри коробки

Я работаю со SceneKit и у меня есть проблема: Когда я делаю два куба, один внутри другого, один из которых имеет полупрозрачную текстуру, куб внутри не рисуется.

Как это должно быть (сцена создана в XCode)

Как на самом деле (я сделал несколько пикселей с альфой 0, чтобы понять, что нужно видеть)

Изменить: я обнаружил проблему, связанную с блендером, но очень похожую на мою Ссылка


person Freename Freefam    schedule 24.12.2020    source источник
comment
Можете ли вы показать нам свой код для настройки сцены и кубов?   -  person ZAY    schedule 25.12.2020
comment
Блоки @ZAY с текстурой создаются из элементов пользовательской геометрии 'SCNGeometry *geometry = [SCNGeometrymetryгеометрияWithSources:@[vertexSource, normalSource, uvSource]:@[indicesElement]];' красные линии по краям куба — стандартное поле с модифицированным шейдером для отрисовки только по краям Конфигурация сцены '_sceneView.scene = scene; _sceneView.antialiasingMode = SCCNAntialiasingModeNone; _sceneView.autoenablesDefaultLighting = ДА; _sceneView.allowsCameraControl = ДА; _sceneView.contentMode = UIViewContentModeScaleAspectFit;'   -  person Freename Freefam    schedule 28.12.2020
comment
это может быть шейдерная программа (SCNProgram), которую вы используете, потому что она заменит все шейдеры, поставляемые с scenekit. Если вы хотите что-то вроде первого примера изображения, вы сможете сделать это с помощью стандартных шейдеров из scenekit. Попробуйте создать разные материалы для двух кубов, настройте их модели освещения и придайте внешнему кубу прозрачность 0,3 или 0,4.   -  person ZAY    schedule 29.12.2020
comment
Я наконец нашел причину. Все зависит от того, в каком порядке добавляются кубики. если сначала добавить маленькую, то все будет работать, если большую - то маленькую не будет видно. Самая большая проблема в том, что приложение представляет собой 3D-редактор, и порядок элементов задается пользователем. Я постараюсь найти решение.   -  person Freename Freefam    schedule 29.12.2020


Ответы (1)


Для тех, кто столкнется с той же проблемой, что и я: она решена, но не полностью.

Решение заключается в расчете порядка рендеринга в зависимости от размера в геометрии. Результат не стабильный, но лучше, чем ничего.

cubeDict[@"render_order"] = @((sizeX + inflateDouble) + (sizeY + inflateDouble) + (sizeZ + inflateDouble));
person Freename Freefam    schedule 11.01.2021