在WorldWind Java / JOGL中使用自定义着色器

或在WorldWind Java中创建IR效果 我需要在WorldWind中模拟红外(IR)视图,我不确定最好的方法。我应该指出,我不需要模拟IR(即没有热图) - 我只需要产生合理的黑白IR显示传真。我的图形知识非常有限,没有OpenGL,JOGL或WorldWind的经验。 根据我目前的研究,似乎最好的方法是使用自定义着色器。但是,据我所知,WorldWind不提供高级着色器支持。 我在WorldWind论坛上找到了以下相关主题,但我仍然不确定如何继续: GLSL Shader支持正确渲染切片 使用新JOGL更新GLSL支持 法线贴图(GLSL着色器) GLSL片段着色器问题 澄清我的问题: 如果这实际上是最好的方法,如何将GLSL着色器集成到WorldWind应用程序中?如果没有,我应该如何实现这种效果?     
已邀请:
由于tve和what_nick在这个帖子中的贡献:GLSL Shader支持正确渲染tile,因此结果相当简单。具体来说,我重用了tve贡献的GLSL类(在shader_support_051308.zip中)并修改了what_nick的示例代码。 我定义了一个DecorativeLayer类,允许任何图层使用新的渲染策略进行“修饰”,然后定义一个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();
        }
    }
}
需要做更多工作才能使其完全通用,但这应该是一个合理的起点。     

要回复问题请先登录注册