或 在WorldWind Java 中创建IR效果
我需要在WorldWind中模拟红外(IR)视图,我不确定最好的方法。我应该指出,我不需要模拟 IR(即没有热图) - 我只需要产生一个合理的黑白IR传真显示。我的图形知识非常有限,以及之前没有OpenGL,JOGL或WorldWind的经验。
根据我目前的研究,似乎最好的方法是使用自定义着色器。但是,据我所知,WorldWind不提供高级着色器支持。
我在WorldWind论坛上找到了以下相关主题,但我仍然不确定如何继续:
澄清我的问题:
如何将GLSL着色器集成到WorldWind应用程序中,如果这实际上是最好的方法?如果没有,我应该如何实现这种效果?
答案 0 :(得分:1)
由于tve和what_nick在这个帖子中的贡献:GLSL Shader support that renders tiles correctly,结果相当简单。具体来说,我重用了由tve(在shader_support_051308.zip)贡献的GLSL类并修改了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();
}
}
}
需要做更多工作才能使其完全通用,但这应该是一个合理的起点。