2011-02-03 49 views
3

創建於WorldWind Java使用自定義着色器在世界風的Java/JOGL

我要仿效世界風紅外(IR)視圖中的IR的效果,我不知道要最好的辦法去做這件事。我應該指出,我不需要需要模擬 IR(即沒有熱圖) - 我只需要產生一個合理的黑白紅外顯示屏的傳真。我的圖形知識非常有限,沒有OpenGL,JOGL或WorldWind的經驗。

根據我迄今爲止的研究,似乎最好的方法是使用自定義着色器。但是,據我所知,WorldWind沒有提供高級着色器支持。

我發現一個世界風論壇下面的相關主題,但我仍然不知道如何着手:

澄清我的問題:

如何將GLSL着色器集成到WorldWind應用程序中,如果這實際上是最佳方法?如果不是,我應該如何實現這種效果?

+0

對響應非常感興趣 - 我在工作中使用WorldWind的應用程序,但從未想過使用自定義着色器。 – I82Much 2011-02-04 02:07:59

回答

1

由於tve和what_nick在該主題中的貢獻,結果相當簡單:GLSL Shader support that renders tiles correctly。具體來說,我重用了tve貢獻的GLSL類(在shader_support_051308.zip中)並修改了what_nick的示例代碼。

我定義了一個DecoratedLayer類,允許任何一層被「裝飾」以新的渲染策略,然後定義一個ShadingDecorator是委託給底層的render方法之前設置的GLSL着色器:

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

需要做更多的工作才能做到這一點,但這應該是一個合理的出發點。