android-OpenGL着色器.传递float数组
作者:互联网
在我的场景中,我有许多物体想同时旋转但角度不同.
我有一个着色器,用于计算每个对象的位置并绘制整个场景(将顶点数组传递到具有顶点数组的着色器中).
"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 []中传递浮点数组(每个“对象”的角度),但是happinig没什么.
public void setRotations(float[] rotations)
{
GLES20.glUniform3fv(muRotation, rotations.length, rotations, 0);
}
如果通过并仅使用一个浮子,则一切正常.
我如何为每个对象传递特定的浮点数(例如,我想绘制20个矩形(我有一个vetrex数组:float [20 * 3 * 4]),因为我了解每个顶点必须具有浮点数:rotations:float [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" ...
颜色和蒙版纹理具有相同的尺寸
解决方法:
GLES20.glUniform1i(ShaderProgram.sUniformMask,GLES20.GL_TEXTURE1);
如果这是您的采样器制服,则应显示为:
GLES20.glUniform1i(ShaderProgram.sUniformMask,1); (不是GL_TEXTURE1)
类似于sampler0:
GLES20.glUniform1i(ShaderProgram.sUniformMask,0);
标签:uniform,opengl-es,shader,android 来源: https://codeday.me/bug/20191201/2077910.html