或在 WorldWind Java中创建IR效应
我需要在WorldWind中模拟一个红外(IR)视图,而且我不确定这方面的最佳方法。我应该指出,我不需要模拟红外(即没有热图) --我只需要制作一个黑白红外显示器的合理传真。我的图形知识非常有限,以前没有使用OpenGL、JOGL或WorldWind的经验。
根据我到目前为止的研究,最好的方法似乎是使用自定义着色器。然而,据我所知,WorldWind没有提供高级别的着色器支持.
我在一个WorldWind论坛上找到了以下相关的线程,但我仍然不确定如何进行:
澄清我的问题:
如何将GLSL着色器集成到WorldWind应用程序中,如果这实际上是最好的方法?如果没有,我应该如何实现这一效果?
发布于 2011-02-10 19:35:31
由于tve和what_nick在这个线程:GLSL着色器支持正确呈现瓷砖中的贡献,这是非常简单的。具体来说,我重用了tve (在051308.zip中)提供的GLSL类,并修改了nick_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();
}
}
}需要做更多的工作才能使这一概念具有充分的普遍性,但这应该是一个合理的起点。
https://stackoverflow.com/questions/4891068
复制相似问题