このスレッドでのtveとwhat_nickの貢献のおかげで、これはかなり簡単であることがわかりました。タイルを正しくレンダリングするGLSLシェーダーのサポート。具体的には、tve(shader_support_051308.zip内)によって提供されたGLSLクラスを再利用し、what_nickのサンプルコードを変更しました。
新しいレンダリング戦略で任意のレイヤーを「装飾」できるDecoratedLayerクラスを定義し、次に、基になるレイヤーのrender
メソッドに委任する前にGLSLシェーダーを設定するShadingDecoratorを定義しました。
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();
}
}
}
これを完全に一般化するにはさらに作業が必要ですが、これは妥当な出発点となるはずです。