OpenGL 着色器。传递浮点数数组

2024-01-01

在我的场景中,我有许多物体想要同时旋转但角度不同。

我有一个着色器,可以计算每个对象的位置并绘制整个场景(将顶点数组传递到带有顶点数组的着色器中)。

    "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 个带有顶点偏移量的数组,一个用于颜色等)。

我想在一个 float[] 中传递浮点数数组(每个“对象”的角度),但没有任何反应。

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

如果通过并仅使用一个浮点数,则一切正常。

我如何为每个对象传递特定的浮点(例如,我想绘制 20 个矩形(我有一个 vetrex 数组:float[20*3*4]),据我所知,我必须为每个顶点设置浮点:旋转:float[20 *4])?

UPDATED:

我尝试将数组作为纹理传递。

当我为场景创建资源时 - 我尝试创建我的数组(称为蒙版):

    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

UPDATED

片段着色器包含:

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

颜色和蒙版纹理具有相同的尺寸


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

如果这是您的采样员制服,则应为:

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

与sampler0类似:

GLES20.glUniform1i(ShaderProgram.sUniformMask, 0);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 着色器。传递浮点数数组 的相关文章

随机推荐