编辑:
似乎错误是,我不允许在一个单独的线程中编译着色器?由于我刚刚将对象加载推送到线程环境,因此出现了错误消息。只是没有想到它可能是它的原因。
由于某种原因,我当前的顶点着色器无法编译。我收到的错误信息不存在,我无法找到错误。
uniform mat4 u_MVPMatrix;
uniform mat4 u_MVMatrix;
uniform vec3 u_CameraPos;
attribute vec4 a_Position;
attribute vec4 a_Color;
attribute vec3 a_Normal;
varying vec3 v_Position;
varying vec4 v_Color;
varying vec3 v_Normal;
varying vec3 v_CameraPosition;
varying vec4 v_Ambient;
void main()
{
v_Position = vec3(u_MVMatrix * a_Position);
v_Color = a_Color;
v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));
//v_CameraPosition = vec3(u_MVMatrix * vec4(u_CameraPos, 0.0)); // taken out to debug
v_CameraPosition = u_CameraPos;
gl_Position = u_MVPMatrix * a_Position;
}
这个片段着色器是:
precision mediump float;
uniform vec3 u_LightPos;
uniform vec4 u_Light;
uniform vec4 u_Ambient;
uniform vec3 u_LightDirection;
uniform vec3 u_CameraPos;
varying vec4 v_Ambient;
varying vec3 v_Position;
varying vec4 v_Color;
varying vec3 v_Normal;
varying vec3 v_CameraPosition;
// The entry point for our fragment shader.
void main()
{
float distance = length(u_LightPos - v_Position);
vec3 lightVector = normalize(u_LightPos - v_Position);
float diffuse = max(dot(v_Normal, lightVector), 0.1);
diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));
// specular lighting removed due to debugging
gl_FragColor = v_Color * (u_Ambient + (diffuse * u_Light));
}
"尝试"收到错误消息:
Log.d(TAG, "Compilation -> " + GLES20.glGetShaderInfoLog(iShader));
从方法返回一个空字符串,以及
Log.e(TAG, "Vertex Shader Failed -> " + GLES20.glGetError());
只返回0。
我正在开发适用于Android的OpenGL ES 2.0,如果对Android有任何我不知道的限制吗?
感谢您的帮助!
答案 0 :(得分:1)
OpenGL上下文仅适用于每个线程,因此您是正确的。如果要创建后台加载线程,您不仅需要在该线程中创建新上下文,还要确保它共享资源(eglCreateContext中的第三个参数)。请注意,共享上下文资源可能无法在某些(较旧的)设备上运行。