Рендеринг изображения с использованием потоков Причины шумных изображений - PullRequest
2 голосов
/ 26 июня 2019

Я создал свой собственный базовый трассировщик лучей.Я пытался оптимизировать его производительность, поэтому я подумал об использовании потоков.Когда я рендеринг без потоков - все выглядит хорошо, но когда я пытался использовать потоки - у меня шумная картинка с черными полосами на нем.

Это код.для каждой строки пикселей я создал нового исполнителя для вычисления цветов пикселей в этой строке:

public void renderImage(){
        Camera camera = _scene.get_camera();

        for (int i = 0; i < _imageWriter.getWidth(); ++i){
            final int iFinal = i;

            ExecutorService executor = Executors.newSingleThreadExecutor();
            executor.submit(() -> {
                for (int j = 0; j < _imageWriter.getHeight(); ++j){
                    ArrayList<Ray> rays = camera.constructRaysThroughPixel(
                            _imageWriter.getNx(), _imageWriter.getNy(),
                            iFinal, j, _scene.get_screenDistance(),
                            _imageWriter.getWidth(), _imageWriter.getHeight()
                    );

                    Color color = new Color();
                    for (Ray ray: rays) {

                        ArrayList<GeoPoint> intersectionPoints = _scene.get_geometries().findIntersections(ray);

                        if (intersectionPoints.isEmpty() == true) {
                            color = color.add(_scene.get_background());
                        }
                        else {
                            GeoPoint closestPoint = getClosestPoint(intersectionPoints);

                            color = color.add(new Color(calcColor(closestPoint, new Ray(camera.get_origin(), closestPoint.point.subtract(camera.get_origin())))));
                        }
                    }

                    int length = rays.size();
                    color = color.scale(1.0/length);

                    _imageWriter.writePixel(iFinal, j, color.getColor());

                }
            });
        }
    }

Вот что я получил, когда использовал потоки: enter image description here

Вот что я получил, когда не использовал потоки: enter image description here

...