Задать вопрос
Ответы пользователя по тегу Java
  • RayTracing - какая должна быть формула для корректного затенения поверхности под различными углами?

    @sanex3339 Автор вопроса
    Ну, вроде поправил.

    ab53580fd6d8414d9e1f8cb916683422.jpg

    Суть оказалась в том, что у меня итоговая картинка собирается из пассов (для каждого пикселя):
    цвет поверхности, пасс - черно-белая маска прямого освещения, пасс прямого освещения (комбинированные 1-е 2 пасса), пасс ambient occlusion и пасс глобального освещения.

    При расчете пасса глобального освещения у меня рекурсивно берутся данные глобального освещения за следующие итерации.

    И тут крылся баг: если точка, для которой рассчитывалось освещение являлась источником света - я просто возвращал цвет источника (emission color), а надо было еще назначить в сооветствующие переменные пассов - необходимые цвета, т.к. данные переменных каждого пасса используются в предыдущих итерациях:

    this.surfaceColor = intersection.getOwner().getMaterial().getEmission().getEmissionColor();
                this.lightSamplingColor = RGBColor.WHITE;
                this.ambientOcclusionColor = this.lightSamplingColor;
                this.globalIlluminationColor = this.surfaceColor;
    
                return this.surfaceColor;


    Вот получившиеся рендеры с одинаковыми настройками:

    417d1bd62d0640f6ad79a884c127536f.jpg1c385c83ffbc423f8baa749ba8d3a1de.jpg

    Теперь бы еще понять - что за дурацкие разводы на сферах, которые имеют место с самых первых версий PathTracer'а.
    Ответ написан
    Комментировать
  • ExecutorService - как правильно получить данные из нескольких Callable потоков?

    @sanex3339 Автор вопроса
    Нашел решение с использованием CompletitionService.

    executorService = Executors.newFixedThreadPool(threadsCount);
            completionService = new ExecutorCompletionService<>(executorService);
    
            for (int i = 0; i < threadsCount; i++) {
                completionService.submit(
                    renderDataProvider.callback()
                );
            }
    
            while (true) {
                try {
                    renderDataHandler.callback(
                        completionService.take()
                    );
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
    
                completionService.submit(
                    renderDataProvider.callback()
                );
            }
    Ответ написан
    Комментировать
  • Чем отличается комментарии //, /** */ и /* */?

    @sanex3339
    // Однострочный комментарий
    
    /**
     * Многострочный комментарий. Чаще всего используется для документации
     * Многострочный комментарий. Чаще всего используется для документации
     */
    
    /* Многострочный комментарий
       Многострочный комментарий */

    journals.ecs.soton.ac.uk/java/tutorial/getStarted/...
    Ответ написан
    2 комментария