Использование пользовательских шейдеров в WorldWind Java / JOGL - PullRequest
3 голосов
/ 03 февраля 2011

или Создание ИК-эффекта в WorldWind Java

Мне нужно эмулировать инфракрасное (ИК) представление в WorldWind, и я не уверен, как лучше всего это сделать. Я должен отметить, что мне не нужно имитировать ИК (т.е. нет тепловых карт) - мне просто нужно создать разумное факсимиле черно-белого ИК-дисплея. У меня очень ограниченные знания графики и нет опыта работы с OpenGL, JOGL или WorldWind.

Судя по моим исследованиям, кажется, что лучший подход - использовать пользовательский шейдер. Однако, насколько я могу судить, WorldWind не предоставляет высокоуровневую поддержку шейдеров.

Я нашел следующие соответствующие темы на форуме WorldWind, но я все еще не уверен, как поступить:

Чтобы уточнить мой вопрос (ы):

Как интегрировать шейдер GLSL в приложение WorldWind, если это действительно лучший подход? Если нет, то как мне реализовать этот эффект?

1 Ответ

1 голос
/ 10 февраля 2011

Это оказалось довольно просто благодаря вкладу tve и what_nick в эту тему: Поддержка шейдеров GLSL, которая правильно отображает плитки . В частности, я повторно использовал класс GLSL, предоставленный tve (в shader_support_051308.zip ), и изменил пример кода what_nick.

Я определил класс DecoratedLayer, который позволяет «украшать» любой слой с помощью новой стратегии рендеринга, затем определил ShadingDecorator, который устанавливает шейдер GLSL перед делегированием методу render нижележащего уровня:

public class DecoratedLayer implements Layer {
    private final Layer _layer;
    private final I_LayerDecorator _decorator;

    public DecoratedLayer(Layer layer, I_LayerDecorator decorator) {
        _layer = layer;
        _decorator = decorator;
    }

    @Override
    public void preRender(DrawContext dc) {
       _decorator.preRender(dc, _layer);
    }

    @Override
    public void render(DrawContext dc) {
       _decorator.render(dc, _layer);
    }

    // all other methods delegate to _layer
}

public class ShadingDecorator implements I_LayerDecorator {
    private GLSL glsl;
    private final File vertfile;
    private final File fragfile;

    public ShadingDecorator(final File vertexShaderFile, 
                            final File fragmentShaderFile) {
        vertfile = vertexShaderFile;
        fragfile = fragmentShaderFile;
    }

    @Override
    public void preRender(DrawContext dc, Layer layer) {
        if (glsl == null) {
            glsl = new GLSL(dc.getGL());
            glsl.loadVertexShader(vertfile);
            glsl.loadFragmentShader(fragfile);
        }
        layer.preRender(dc);
    }

    @Override
    public void render(DrawContext dc, Layer layer) {
        if (glsl != null) {
            glsl.useShaders();
            glsl.startShader();
            GL gl = dc.getGL();
            gl.glUniform1i(glsl.getUniformLocation("tile_image"), 0);

            layer.render(dc);

            glsl.endShader();
        }
    }
}

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

...