ch.kuramo.javie.api.annotations
注釈タイプ ShaderSource


@Target(value=FIELD)
@Retention(value=RUNTIME)
public @interface ShaderSource

この注釈が付けられたフィールドは、プログラマブルシェーダのソースコードに関するものであると認識されます。

この注釈は、String 型もしくは String[] 型の public なフィールドに付けることができます。 String 型の場合はフィールドの値がソースコードのリソースファイル名であるものとして処理されます。 String[] 型の場合はフィールドの値自体がソースコードであるものとして処理されます。

この注釈を付けられたフィールドが static でない場合、 そのフィールドを含むクラスをインスタンス化してからフィールドの値が読み出されます。 TODO: この場合の使用方法の詳細を書く

シェーダには、この注釈が付けられたフィールドを含むクラスの完全修飾クラス名とフィールド名を . で連結した 「完全修飾クラス名.フィールド名」という形式の名前が付けられます。

program() が true のシェーダはシェーダプログラムです。 そうでない場合はシェーダオブジェクトです。

シェーダプログラムは IShaderRegistry サービスから IShaderProgram オブジェクトとして取り出す事ができます。 シェーダのコンパイル及びリンクは、IShaderProgram を初めて使用するときに自動的に実行されます。

使用例:

  @Effect
  public class InvertColor {
  
        // ソースコードをリソースファイルに記述する場合
        //@ShaderSource
        //public static final String INVERT_COLOR = "invert_color.frag";
  
        // ソースコードを直接記述する場合
        @ShaderSource
        public static final String[] INVERT_COLOR = {
                "uniform sampler2D source;",
                "",
                "void main(void)",
                "{",
                "       vec4 prmult = texture2D(source, gl_TexCoord[0].st);",
                "       if (prmult.a != 0.0) {",
                "               vec3 unmult = prmult.rgb/prmult.a;",
                "               unmult = 1.0 - unmult;",
                "               gl_FragColor = vec4(unmult, 1.0) * prmult.a;",
                "       } else {",
                "               gl_FragColor = vec4(0.0);",
                "       }",
                "}"
        };
  
        private final IVideoEffectContext context;
  
        private final IVideoRenderSupport support;
  
        private final IShaderProgram program;
  
        @Inject
        public InvertColor(IVideoEffectContext context, IVideoRenderSupport support, IShaderRegistry shaders) {
                this.context = context;
                this.support = support;
  
                // シェーダのソースコードに対応する IShaderProgram オブジェクトを取得する
                program = shaders.getProgram(InvertColor.class, "INVERT_COLOR");
        }
  
        public IVideoBuffer doVideoEffect() {
                IVideoBuffer source = context.doPreviousEffect();
                if (source.getBounds().isEmpty()) {
                        return source;
                }
                try {
                        Set<GLUniformData> uniforms = new HashSet<GLUniformData>();
                        uniforms.add(new GLUniformData("source", 0));
  
                        // シェーダプログラムを使用する
                        return support.useShaderProgram(program, uniforms, null, source);
  
                } finally {
                        source.dispose();
                }
        }
  }
 


任意要素の概要
 java.lang.String[] attach
          シェーダがシェーダプログラムの場合、 それに関連付けるシェーダオブジェクトを指定します。
 boolean program
          シェーダがシェーダプログラムかどうかを指定します。
 ShaderType type
          シェーダの種類を指定します。
 

type

public abstract ShaderType type
シェーダの種類を指定します。

戻り値:
シェーダの種類
デフォルト:
FRAGMENT_SHADER

program

public abstract boolean program
シェーダがシェーダプログラムかどうかを指定します。

戻り値:
シェーダがシェーダプログラムの場合は true、そうでない場合は false
デフォルト:
true

attach

public abstract java.lang.String[] attach
シェーダがシェーダプログラムの場合、 それに関連付けるシェーダオブジェクトを指定します。

戻り値:
シェーダプログラムに関連付けるシェーダオブジェクトの名前
デフォルト:
{}