目前我正在Android中使用OpenGLES 2.0,我正在努力开发灵活的编程架构来动态处理不同的着色器和不同的对象。
例如,我有两个类: SimpleShader 和 ImageShader 。
要绘制 SimpleShader ,需要指定一个顶点数组:
SimpleShader s = new SimpleShader;
s.draw(final FloatBuffer pFloatBuffer);
同样,对于 ImageShader ,它需要一组点和要绘制的纹理:
ImageShader i = new ImageShader;
i.draw(final FloatBuffer pFloatBuffer, final Texture pTexture);
我的问题是这个; SimpleShader 和 ImageShader 都是着色器的类型。我正在寻找一种允许我使用抽象draw()
方法的设计模式。有人可以提出任何建议吗?我想它与绘制继承着色器特定绘图界面的对象有关?
答案 0 :(得分:1)
首先,您需要一个包装类作为参数。如:
public class ShaderParameter{
public FloatBuffer PFloatBuffer;
}
如果需要PFloatBuffer
(必须),请注入构造函数。
然后,您可以再次创建绘图基类。如:
public abstract class Shader{
public void Draw(ShaderParameter param);
}
然后您可以继承这些课程以满足您的需求:
public class ImageShaderParameter extends ShaderParameter{
public Texture PTexture;
}
public class ImageShaderWrapper extends Shader{
public override void Draw(ShaderParameter param){
ImageShaderParameter parameter = (ImageShaderParameter)param;
ImageShader i = new ImageShader;
i.draw(parameter.PFloatBuffer, parameter.PTexture);
}
}
使用泛型可以更多地增强这一点,以避免参数转换和策略模式。然而,这种解释太长,适合其他问题。
(代码可能基于C#,因为我的经验更多是使用C#)
答案 1 :(得分:0)
您可以尝试策略模式。
它专注于实体之间的不同行为。所以你可以有一个抽象类“Shader”,它具有特定的绘制行为。
答案 2 :(得分:0)
您可以将纹理设置为着色器上的属性,并且如果适用于您的抽象,则具有单个参数draw
。
或者您可以概括Texture参数,以便始终将其作为第二个参数传递给任何Shader变得明智。
即也许它应该扩展一个Paint接口,就像在java.awt中一样。
或者它可能是具有更多属性的DrawContext的一部分,因此您总是将DrawContext作为第二个参数传递给draw方法。
第三,你可以看一下java.awt.Graphics2D,它就像一个DrawContext,它也封装了绘图目标/表面。这将是您draw
方法的唯一参数。