3

または WorldWindJavaでIRエフェクトを作成する

WorldWindで赤外線(IR)ビューをエミュレートする必要がありますが、これを実行するための最良の方法がわかりません。IRをシミュレートする必要はない(つまりヒートマップがない)ことを指摘する必要があります。必要なのは、白黒のIRディスプレイの妥当な複製を作成することだけです。グラフィックに関する知識は非常に限られており、OpenGL、JOGL、またはWorldWindの使用経験はありません。

これまでの私の調査によると、カスタムシェーダーを使用するのが最善の方法のようです。ただし、私が知る限り、WorldWindは高レベルのシェーダーサポートを提供していません。

WorldWindフォーラムで次の関連するスレッドを見つけましたが、どうすればよいかまだわかりません。

私の質問を明確にするために:

GLSLシェーダーをWorldWindアプリケーションに統合するにはどうすればよいですか?それが実際に最良のアプローチである場合はどうすればよいですか?そうでない場合、この効果をどのように実装する必要がありますか?

4

1 に答える 1

1

このスレッドでのtveとwhat_nickの貢献のおかげで、これはかなり簡単であることがわかりました。タイルを正しくレンダリングするGLSLシェーダーのサポート。具体的には、tve(shader_support_051308.zip内)によって提供されたGLSLクラスを再利用し、what_nickのサンプルコードを変更しました。

新しいレンダリング戦略で任意のレイヤーを「装飾」できるDecoratedLayerクラスを定義し、次に、基になるレイヤーのrenderメソッドに委任する前にGLSLシェーダーを設定するShadingDecoratorを定義しました。

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();
        }
    }
}

これを完全に一般化するにはさらに作業が必要ですが、これは妥当な出発点となるはずです。

于 2011-02-10T19:35:31.530 に答える