有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

WorldWind Java中创建红外效果

我需要在WorldWind中模拟红外(IR)视图,我不确定最好的方法是什么。我应该指出,我不需要模拟红外(即没有热图)——我只需要制作一个黑白红外显示器的合理传真。我的图形知识非常有限,之前没有OpenGL、JOGL或WorldWind的经验

根据我到目前为止的研究,似乎最好的方法是使用自定义着色器。然而,据我所知,WorldWind不提供高级着色器支持

我在WorldWind论坛上找到了以下相关线索,但我仍然不确定如何继续:

澄清我的问题:

如果这是最好的方法,我如何将GLSL着色器集成到WorldWind应用程序中?如果没有,我应该如何实现这一效果


共 (1) 个答案

  1. # 1 楼答案

    多亏了tve的贡献和本帖中的内容:GLSL Shader support that renders tiles correctly,这一点变得相当简单。具体地说,我重用了tve(inshader_support_051308.zip)提供的GLSL类,并修改了_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();
            }
        }
    }
    

    需要做更多的工作才能使其完全通用,但这应该是一个合理的起点