Ich versuche mit OpenGL2.0 und erstellen Sie mehrere Würfel im 3D-Raum, für Android-Geräte.Warum gibt GLES20.glGetAttribLocation unterschiedliche Werte für verschiedene Geräte zurück?
Der Code es perfekt in einigen Geräten läuft, in anderen aber nicht, und ich weiß nicht, warum ... (Alle Geräte verfügen über OpenGL 2.0 unterstützt, und haben kürzlich Android Versionen [5.0 oder 6.0])
ich weiß nur, dass das Problem in einem -1 Rückgabewert (siehe unten)
int vertexShader = loadGLShader(GLES20.GL_VERTEX_SHADER, R.raw.vertex);
int gridShader = loadGLShader(GLES20.GL_FRAGMENT_SHADER, R.raw.grid_fragment);
int passthroughShader = loadGLShader(GLES20.GL_FRAGMENT_SHADER, R.raw.fragment_color);
cubeProgram1 = GLES20.glCreateProgram();
GLES20.glAttachShader(cubeProgram1, vertexShader);
GLES20.glAttachShader(cubeProgram1, passthroughShader);
GLES20.glLinkProgram(cubeProgram1);
GLES20.glUseProgram(cubeProgram1);
cubePositionParam1 = GLES20.glGetAttribLocation(cubeProgram1, "a_Position");
cubeNormalParam1 = GLES20.glGetAttribLocation(cubeProgram1, "a_Normal"); ----> Returns -1 Value
cubeLightPosParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_LightPos");
cubeModelParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_Model") cubeModelViewParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_MVMatrix");
cubeModelViewProjectionParam1 = GLES20.glGetUniformLocation(cubeProgram1, "u_MVP");
....
GLES20.glEnableVertexAttribArray(cubeNormalParam1); ---> Returns -1 ...
die cubeNormalParam1 = GLES20.glGetAttribLocation(cubeProgram1, "a_Normal");
kehrt Wert 2 in einigen Geräten und -1 in anderen . Diejenigen, die haben -1 Wert, geben Fehler und läuft nicht ...
Ich versuche festzustellen, ob die vertex_shader Fehler haben, aber ich kann keine Probleme sehen ...
uniform mat4 u_Model;
uniform mat4 u_MVP;
uniform mat4 u_MVMatrix;
uniform vec3 u_LightPos;
attribute vec4 a_Position;
attribute vec4 a_Color;
attribute vec3 a_Normal;
attribute vec2 a_TexCoordinate;
varying vec4 v_Color;
varying vec3 v_Grid;
varying vec2 v_TexCoordinate;
void main() {
v_Grid = vec3(u_Model * a_Position);
vec3 modelViewVertex = vec3(u_MVMatrix * a_Position);
vec3 modelViewNormal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));
float distance = length(u_LightPos - modelViewVertex);
vec3 lightVector = normalize(u_LightPos - modelViewVertex);
float diffuse = max(dot(modelViewNormal, lightVector), 0.5);
diffuse = diffuse * (1.0/(1.0 + (0.00001 * distance * distance)));
v_Color = a_Color * diffuse;
v_TexCoordinate = a_TexCoordinate;
gl_Position = u_MVP * a_Position;
}
Warum Dies geschieht? Ist die Hardware?
Jede Lösung, um dies zu beheben?
Cube zu zeichnen Ich habe dies:
public void drawCube1() {
cubeNumber = 1;
GLES20.glUseProgram(cubeProgram1);
GLES20.glUniform3fv(cubeLightPosParam1, 1, lightPosInEyeSpace, 0);
// Set the Model in the shader, used to calculate lighting
GLES20.glUniformMatrix4fv(cubeModelParam1, 1, false, modelCube, 0);
// Set the ModelView in the shader, used to calculate lighting
GLES20.glUniformMatrix4fv(cubeModelViewParam1, 1, false, modelView, 0);
// Set the ModelViewProjection matrix in the shader.
GLES20.glUniformMatrix4fv(cubeModelViewProjectionParam1, 1, false, modelViewProjection1, 0);
// Set the position of the cube
GLES20.glVertexAttribPointer(
cubePositionParam1, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, cubeVertices);
// Set the normal positions of the cube, again for shading
GLES20.glVertexAttribPointer(cubeNormalParam1, 3, GLES20.GL_FLOAT, false, 0, cubeNormals);
// Set the active texture unit to texture unit 0.
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
// Bind the texture to this unit.
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextura1);
isLookingAtObject_Number(cubeNumber);
// Tell the texture uniform sampler to use this texture in the shader by binding to texture unit 0.
GLES20.glUniform1i(mTextureUniform, 0);
GLES20.glVertexAttribPointer(mTextureCoordinate, 2, GLES20.GL_FLOAT, false, 0, cubeTexture);
GLES20.glEnableVertexAttribArray(mTextureCoordinate);
GLES20.glEnableVertexAttribArray(cubePositionParam1);
GLES20.glEnableVertexAttribArray(cubeNormalParam1);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 36);
checkGLError("Drawing cube");
}
Was meinen Sie mit "verschiedenen Geräten"? Verschiedene GPUs? –
Verschiedene Android-Handys und VR-Brillen, zum Beispiel. Es funktioniert in Brillen und einigen Handys, aber in anderen Handys funktioniert nicht (S7 Edge, z. B..). Die GPU von allen unterstützt OpenGL 1.0, 2.0, 3.0. –
Der Fehler ist E/Menü: Zeichnen cube: glError 1281. –