首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在WorldWind Java / JOGL中使用自定义阴影

在WorldWind Java / JOGL中使用自定义阴影
EN

Stack Overflow用户
提问于 2011-02-03 20:03:41
回答 1查看 1.8K关注 0票数 3

WorldWind Java中创建IR效应

我需要在WorldWind中模拟一个红外(IR)视图,而且我不确定这方面的最佳方法。我应该指出,我不需要模拟红外(即没有热图) --我只需要制作一个黑白红外显示器的合理传真。我的图形知识非常有限,以前没有使用OpenGL、JOGL或WorldWind的经验。

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

我在一个WorldWind论坛上找到了以下相关的线程,但我仍然不确定如何进行:

  • GLSL着色器支持正确呈现瓷砖
  • 用新的JOGL更新GLSL支持
  • 正规映射(GLSL着色器)
  • GLSL片段着色问题

澄清我的问题:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-10 19:35:31

由于tve和what_nick在这个线程:GLSL着色器支持正确呈现瓷砖中的贡献,这是非常简单的。具体来说,我重用了tve (在051308.zip中)提供的GLSL类,并修改了nick_nick的示例代码。

我定义了一个DecoratedLayer类,该类允许使用新的呈现策略对任何层进行“修饰”,然后定义一个ShadingDecorator,它在委托给底层的render方法之前设置GLSL着色器:

代码语言:javascript
运行
复制
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();
        }
    }
}

需要做更多的工作才能使这一概念具有充分的普遍性,但这应该是一个合理的起点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4891068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档