3

数日かけて多くの調査とテストを行った後、最終的にフラグメントシェーダーを実装することができました。2002.html .

「gl_FragCoord.y」を使用するフラグメント シェーダーで単純な三角形をレンダリングする方法を教えているだけです。

しかし、これらの営業日の間に、なぜそれらが起こったのかをもう少しよく理解したいと思ういくつかの問題を経験しました.

1つ目- 私のフラグメント シェーダーでは、コードを使用すると gl_FragColor = vec4(gl_FragCoord.x/500.0, 0.0, 1.0, 1.0); 、三角形がレンダリングされます。

しかし、私が使用した場合: gl_FragColor = vec4(gl_FragCoord.x/500, 0.0, 1.0, 1.0); レンダリングされません (黒い画面が表示されるか、GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);.

それは疑問につながります: GLSL では、数字は 10 進法で指定する必要がありますか? コードで変更されたのは、500.0 から 500 への数値だけであることに注意してください。

2 番目-フラグメント シェーダー コード内にある変数値を取得して、たとえばトーストに表示するにはどうすればよいですか? その質問を説明しましょう。

以下の 3 つのコード行を使用します。

float colorTwo[] = { 1.0f, 1.0f, 1.0f, 0.0f };

int mColorHandleTwo = GLES20.glGetUniformLocation(mProgram, "vColorTwo");

GLES20.glUniform4fv(mColorHandleTwo, 1, colorTwo, 0);

この「colorTwo」配列を取得して、フラグメント シェーダー コード内で使用することができました。一方、フラグメントシェーダーコード内に次のようなステートメントがあるとします。

float whatThisNumber = gl_FragCoord.y

このフロートを取得してトーストに表示するにはどうすればよいですか?

以下のコードは、実際に私が取り組んでいるものです。

public class TheShape {

    ByteBuffer myByteBuffer;
    FloatBuffer positionBufferObject;    

    int mProgram;   

    public TheShape() {

        float vertexPositions[] = { 

                 0.75f,  0.75f, 0.0f, 1.0f,
                 0.75f, -0.75f, 0.0f, 1.0f,
                -0.75f, -0.75f, 0.0f, 1.0f

        };

        myByteBuffer = ByteBuffer.allocateDirect(vertexPositions.length * 4);
        myByteBuffer.order(ByteOrder.nativeOrder());

        positionBufferObject = myByteBuffer.asFloatBuffer();
        positionBufferObject.put(vertexPositions);
        positionBufferObject.position(0);

        String vertexShaderCode =
                "attribute vec4 vPosition;" +
                "void main() {" +
                "  gl_Position = vPosition;" +
                "}";

        String fragmentShaderCode =
                "precision mediump float;" +
                "uniform vec4 vColor;" +
                "uniform vec4 vColorTwo;" +
                "void main() {" +
                "gl_FragColor = vec4(gl_FragCoord.x/500.0, 0.0, 1.0, 1.0);" +
         //ok   "gl_FragColor = mix(vColorTwo, vColor, (gl_FragCoord.y)/500.0);" +
         //ok   "gl_FragColor = vec4((gl_FragCoord.x)/500.0, (gl_FragCoord.y)/500.0, 0.0, 1.0);" + 
                "}";

        int myVertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
        GLES20.glShaderSource(myVertexShader, vertexShaderCode);
        GLES20.glCompileShader(myVertexShader);

        int myFragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
        GLES20.glShaderSource(myFragmentShader, fragmentShaderCode);
        GLES20.glCompileShader(myFragmentShader);

        mProgram = GLES20.glCreateProgram();

        GLES20.glAttachShader(mProgram, myVertexShader);        
        GLES20.glAttachShader(mProgram, myFragmentShader); 

        GLES20.glLinkProgram(mProgram);        

    }

    public void draw() {

        GLES20.glUseProgram(mProgram);

        GLES20.glEnableVertexAttribArray(0);
        GLES20.glVertexAttribPointer(0, 4, GLES20.GL_FLOAT, false, 0, positionBufferObject);



        float color[] = { 0.0f, 0.0f, 0.0f, 1.0f };  
        int mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);


        float colorTwo[] = { 1.0f, 1.0f, 1.0f, 0.0f };  
        int mColorHandleTwo = GLES20.glGetUniformLocation(mProgram, "vColorTwo");
        GLES20.glUniform4fv(mColorHandleTwo, 1, colorTwo, 0);



        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);

    }

}

質問が明確だったことを願っています。

4

2 に答える 2

2
  1. glsl 言語では、整数から浮動小数点数への自動変換がないため、コード行によってgl_FragColor = vec4(gl_FragCoord.x/500, 0.0, 1.0, 1.0); コンパイラ エラーが発生します。
  2. Java コード (または C++ コード) からシェーダー変数の値を取得することはできません。Java コードは CPU から実行され、シェーダーは GPU から実行されます。

それが役に立てば幸い。

于 2014-09-26T20:14:56.697 に答える