3

私のシーンには、同時に回転させたいが異なる角度で回転させたい多くのオブジェクトがあります。

各オブジェクトの位置を計算し、シーン全体を描画するシェーダーがあります (頂点の配列を使用して頂点配列をシェーダーに渡します)。

    "uniform float uRotation;" +
    ...
    "   mat4 mz = mat4(1.0);" +
    "   mz[0][0] = cos(rotation);" +
    "   mz[0][1] = sin(rotation);" +
    "   mz[1][0] = -sin(rotation);" +
    "   mz[1][1] = cos(rotation);" +
    ...
    gl_Position = uMVPMatrix * (aPosition *mz);

私はすべての頂点、インデックス、色などを配列に持っています(オブジェクトごとに1つの配列ではなく、頂点のオフセット、色などの1つの配列を持つ1つの配列)。

1 つの float[] で float の配列 (各「オブジェクト」の角度) を渡したいのですが、何もうまくいきません。

    public void setRotations(float[] rotations)
    {
        GLES20.glUniform3fv(muRotation, rotations.length, rotations, 0);    
    }

パスしてフロートを 1 つだけ使用する場合は、すべて問題ありません。

各オブジェクトに特定のフロートを渡すにはどうすればよいですか (たとえば、20 個の長方形を描画したい (vetrex 配列: float[20*3*4] があります))。 *4])?

更新しました:

配列をテクスチャとして渡そうとします。

シーンのリソースを作成するとき - 配列 (マスクと呼ばれる) を作成しようとします。

    mask = new float[512*512*4];
    for (int i = 0; i < mask.length; i++)
    {
        mask[i] = 2f;
    }

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756);
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 1, GLES20.GL_RGBA, 512, 512, 0, GLES20.GL_RGBA, GLES20.GL_FLOAT, FloatBuffer.wrap(mask));
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

次に、シーンに新しいアイテムを描画するときに、シェーダーを使用して配列を渡そうとします:

    setShaderProgram(ShaderProgram.getInstance());

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glUniform1i(ShaderProgram.sUniformMask, GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

しかし、配列の値をチェックしようとすると、0.5 を超える場合、すべての計算でfalseが返されます

更新しました

フラグメント シェーダーには以下が含まれます。

"uniform sampler2D " + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ";\n" +
"uniform sampler2D " + ShaderProgramConstants.UNIFORM_TEXTURE_1 + ";\n" +
"varying mediump vec2 " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ";\n" +

"void main() {\n" +
"vec4 color = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ", " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ");\n" +
"vec4 mask = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_1 + ", " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ");\n" +
"float maskVal = mask.r;\n" ...

カラー テクスチャとマスク テクスチャの寸法は同じです

4

1 に答える 1

3

GLES20.glUniform1i(ShaderProgram.sUniformMask, GLES20.GL_TEXTURE1);

これがサンプラーのユニフォームの場合は、次のように表示されます。

GLES20.glUniform1i(ShaderProgram.sUniformMask, 1);(GL_TEXTURE1 ではありません)

sampler0 についても同様です。

GLES20.glUniform1i(ShaderProgram.sUniformMask, 0);

于 2012-08-10T15:59:54.980 に答える