Vertex Shader无法编译。找不到错误

时间:2014-03-18 13:39:31

标签: android opengl-es-2.0 glsles

编辑:

似乎错误是,我不允许在一个单独的线程中编译着色器?由于我刚刚将对象加载推送到线程环境,因此出现了错误消息。只是没有想到它可能是它的原因。


由于某种原因,我当前的顶点着色器无法编译。我收到的错误信息不存在,我无法找到错误。

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有任何我不知道的限制吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

OpenGL上下文仅适用于每个线程,因此您是正确的。如果要创建后台加载线程,您不仅需要在该线程中创建新上下文,还要确保它共享资源(eglCreateContext中的第三个参数)。请注意,共享上下文资源可能无法在某些(较旧的)设备上运行。