在World Wind中渲染JSON文件图层:DrawContext获取难题
解决World Wind图层渲染问题
首先得明确一个核心点:World Wind的图层根本不需要你手动调用render()方法——它自带的渲染循环会自动处理所有已注册图层的渲染工作。你只需要把创建好的图层正确添加到WorldWindow的图层集合里就行,具体步骤如下:
- 从你的
appFrame获取WorldWindow实例:WorldWindow wwd = appFrame.getWwd(); - 将你基于JSON创建的自定义图层添加到图层列表:
wwd.getModel().getLayers().add(yourJsonBasedLayer); - 通知WorldWindow刷新渲染:
wwd.redraw();
做完这三步,World Wind的渲染循环会在每帧自动调用图层的render(DrawContext dc)方法,你完全不需要自己去获取或传递DrawContext对象。
如果你确实有特殊需求(比如在某个特定时机手动触发图层渲染,或者需要在其他逻辑里用到DrawContext),那可以通过以下方式获取有效的DrawContext实例:
DrawContext是在World Wind的渲染线程中创建和传递的,你可以给WorldWindow添加一个RenderingListener,在渲染回调中拿到它:
wwd.addRenderingListener(new RenderingListener() { @Override public void stageChanged(RenderingEvent event) { // 只在渲染准备阶段获取有效的DrawContext if (event.getStage() == RenderingEvent.BEFORE_RENDERING) { DrawContext dc = event.getDrawContext(); // 这里可以用dc执行你需要的操作,比如手动调用图层的render方法 yourJsonBasedLayer.render(dc); } } });
另外你提到的appFrame.getWwd().getContext()返回的GlContext是OpenGL底层上下文,和World Wind封装的DrawContext不是一回事——DrawContext包含了渲染所需的所有状态(视口、图层状态、OpenGL上下文等),只有在渲染线程中才能拿到有效实例,没法直接从GlContext转换得到。
最后再啰嗦一句:除非你有非常特殊的自定义渲染逻辑,否则千万别手动调用图层的render()方法,把图层交给WorldWindow的图层列表管理才是标准的正确做法。
内容的提问来源于stack exchange,提问作者Gregory Oliff
相关产品推荐
相关产品推荐

