OpenGL的着色器。 通过浮子的阵列(OpenGL Shaders. Pass array o

2019-09-19 13:33发布

在我的场景我有我想要在同一时间,但在不同的角度来旋转多个对象。

我有计算每个对象的位置和绘制整个场景的着色器(通过顶点数组与顶点阵列着色器)。

    "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个阵列为顶点偏移,一个用于颜色等)。

我想在一个浮子[]通过浮标的阵列(每一个“对象”的角度),但没有被happinig。

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

如果通过,并只使用一个浮动一切正常。

我怎样才能我通过特定浮子为每个对象(例如要绘制20个矩形(我有一个vetrex数组:漂浮[20 * 3 * 4]),为我了解我必须具有浮子为每个顶点:旋转:浮子[20 * 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每计算给了我

更新

片段着色器包含:

"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" ...

颜色和纹理掩模具有相同的尺寸

Answer 1:

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

如果这是你的采样均匀,应改为:

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

类似的sampler0:

GLES20.glUniform1i(ShaderProgram.sUniformMask, 0);



文章来源: OpenGL Shaders. Pass array of float