1

Dart が好きなので、小さな WebGL ゲームを書いています。私Shadersはかなり基本的なクラスを持っています:

class Shaders {
  static final int FRAGMENT = 0;
  static final int VERTEX = 1;

  HashMap<String, webGL.UniformLocation> _uniforms;

  webGL.Program           _program;
  webGL.Shader            _vertShader;
  webGL.Shader            _fragShader;
  webGL.RenderingContext  _gl;


  Shaders(this._gl) {
    _uniforms = new HashMap();
    _program = _gl.createProgram();
    _vertShader = _gl.createShader(webGL.VERTEX_SHADER);
    _fragShader = _gl.createShader(webGL.FRAGMENT_SHADER);
  }

  Future<String> loadSource(String filename) {
    return HttpRequest.getString(filename);
  }

  void compileSource(int type, String data) {
    if (type == VERTEX) {
      _gl.shaderSource(_vertShader, data);
      _gl.compileShader(_vertShader);
      _gl.attachShader(_program, _vertShader);

      if (!_gl.getShaderParameter(_vertShader, webGL.COMPILE_STATUS))
          print("Vertex shader: ${_gl.getShaderInfoLog(_vertShader)}");

    } else if (type == FRAGMENT) {
      _gl.shaderSource(_fragShader, data);
      _gl.compileShader(_fragShader);
      _gl.attachShader(_program, _fragShader);

      if (!_gl.getShaderParameter(_fragShader, webGL.COMPILE_STATUS))
          print("Vertex shader: ${_gl.getShaderInfoLog(_fragShader)}");
    }
  }

  void setUniformMatrix(String name, var mat) {
    //if we dont have this uniform get it and store for later
    if (!_uniforms.containsKey(name)) {
      var loc = _gl.getUniformLocation(_program, name);
      _uniforms[name] = loc;
    }

    _gl.uniformMatrix4fv(_uniforms[name], false, mat.data());
  }

  void bindAttribute(int index, String name) {
    _gl.bindAttribLocation(_program, index, name);
  }

  void useShader() {
    _gl.linkProgram(_program);
    _gl.useProgram(_program);
  }
}

また、RenderComponent描画可能にする必要があるときにエンティティに与えるクラスもあります。次のようになります (これらのクラスは完了していません)。

abstract class Component {
  static final int RENDER = 1;
  int _type;

  Component(this._type);  
  int get type => _type;
}


class RenderComponent extends Component {
  BufferObject _vbo;
  Shaders _shader;

  RenderComponent() : super(Component.RENDER);

  set shader(Shaders s) => _shader = s;
  set buffer(BufferObject v) => _vbo = v;

  Shaders get shader           => _shader;
  BufferObject get buffer      => _vbo;
}

オブジェクトを作成して次RenderComponentのように設定するとshader:

var s = new Shaders(pass in gl context);
var r = new RenderComponent();

r.shader = s;

次のエラー メッセージが表示されます。

例外の中断: タイプ 'Shaders' は 's' のタイプ 'Shaders' のサブタイプではありません。

Google は、私にとって意味のあるものを何も思いつきませんでした。これは私が今まで出会った中で最も役に立たないメッセージであり、私はそれを乗り越えることができません. 誰がこれを引き起こしているのか知っていますか?

4

0 に答える 0