【发布时间】:2023-04-01 05:44:01
【问题描述】:
我正在尝试使用 OpenGL2.0 并在 3D 空间中为 Android 设备创建多个立方体。
它的代码在某些设备上可以完美运行,但在其他设备上却不能,我不知道为什么...(所有设备都支持 OpenGL 2.0,并且具有最新的 android 版本 [5.0 或 6.0])
我只知道问题出在一个-1的返回值上(往下看)
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 ...
cubeNormalParam1 = GLES20.glGetAttribLocation(cubeProgram1, "a_Normal"); 在某些设备中返回值 2,在其他设备中返回 -1。那些有-1值的,给出错误并且不运行......
我正在尝试查看 vertex_shader 是否有错误,但我看不到任何问题...
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;
}
为什么会这样?是硬件吗?
任何解决方案来解决这个问题?
要画立方体,我有这个:
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");
}
【问题讨论】:
-
“不同的设备”是什么意思?不同的 GPU?
-
不同的 Android 手机和 VR 眼镜,例如。它适用于眼镜和某些手机,但在其他手机中不起作用(例如 S7 Edge)。所有的GPU,支持OpenGL 1.0、2.0、3.0。
-
错误是 E/Menu: Drawing cube: glError 1281.
-
关联的片段着色器是什么样的?如果它不使用 v_Color,那么实现可能会随意优化整个计算负载,甚至 a_Color 和 a_Normal 属性。
-
我的想法与@Columbo 在这里提到的一样。如果您不使用 v_Color,着色器可能会被优化并完全删除此属性。所以发布你的片段着色器也会有所帮助
标签: android opengl-es opengl-es-2.0 vertex-shader