OpenGL的着色器。通过浮动的数组 [英] OpenGL Shaders. Pass array of float

查看:308
本文介绍了OpenGL的着色器。通过浮动的数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

On my scene i have many objects that i want to rotate at the same time but on different angles.

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

I have a shader that computes position of each object and draw the whole scene (pass vertex array into the shader with array of vertexes).

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

i have all my vertexes, indexes, colors etc in arrays (not 1 array for each object, but 1 array with offset for vertexes, one for colors etc.).

我想通过float型数组(角度为每一个对象)在一个浮动[],但没有什么是happinig。

I want to pass array of floats (angles for each "object") in one float[], but nothing is happinig.

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

如果通过,只用一个浮点数一切正常。

if pass and use only one float everything is ok.

我如何可以通过特定的浮动对每个对象(例如我想提请20的矩形(我有一个vetrex数组:漂浮[20 * 3 * 4),因为我知道我必须有浮每个顶点:旋转:漂浮[20 * 4])?

How can i pass specific float for each object (for example i want to draw 20 rectangles (i have a vetrex array: float[20*3*4]) as i understand i must have float for each vertex: rotations: float[20*4])?

更新:

我尝试通过阵列作为纹理。

I try to pass array as a texture.

在我的场景中创建资源 - 我尝试创建我的数组(称为面罩):

When i create resources for the scene - i try to create my array (called mask):

    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);

然后当我在现场绘制新的项目我使用着色器,并试图通过我的数组:

Then when i draw new item on scene i use shader and try to pass my array:

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

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

color and mask textures have the same dimensions

推荐答案

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

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

If this is your sampler uniform, it should read:

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

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

有关sampler0类似:

Similar for sampler0:

GLES20.glUniform1i(ShaderProgram.sUniformMask,0);

这篇关于OpenGL的着色器。通过浮动的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆