2016-03-02 2 views
0

J'ai des problèmes avec OpenGLES shader pipeline. J'ai un shader avec 3 uniformesCertains uniformes fonctionnent d'autres pas

attribute vec4 position; 

uniform mat4 modelViewProjection; 
uniform vec3 objectColor; 
uniform vec2 positionObject; 

void main() 
{ 
    vec4 pos = vec4(-positionObject.x + objectColor.x, 0, -positionObject.y, 0); 
    gl_Position = modelViewProjection * (position + pos); 
} 

modelViewProjection et travail positionObject très bien, mais tout en essayant d'obtenir fragment shader au travail, je remarqué que objectColor ne fait rien si j'ai essayé d'expérimenter dans le vertex shader, et puis finalement a découvert qu'il est toujours resté valeur initiale, peu importe quel ordre il est défini, quel type il est, son nom, etc.

que je suis la procédure standard du pipeline de shaders:

compilation -> link -> use programme -> obtenir un emplacement -> initia Lize uniforme

et l'uniforme objectColor obtient même un ID d'être un uniforme actif et il est compté vers des uniformes actifs, mais chaque fois que j'essaie de changer sa valeur, il reste toujours à zéro.

est ici les extraits du code:

emplacement uniforme:

private void BindUniforms() 
{ 
    glUniforms[(int)UNIFORMS_T.MODEL_VIEW_PROJECTION] = GL.GetUniformLocation(glProgramId, "modelViewProjection"); 
    glUniforms[(int)UNIFORMS_T.OBJECT_POSITION] = GL.GetUniformLocation(glProgramId, "positionObject"); 
    glUniforms[(int)UNIFORMS_T.OBJECT_COLOR] = GL.GetUniformLocation(glProgramId, "objectColor"); 
} 

Rendu partie 1:

protected override void OnRenderFrame(FrameEventArgs e) 
{ 
    base.OnRenderFrame(e); 

    GL.ClearColor(0f, 0f, 0f, 1f); 
    GL.Clear((uint)All.ColorBufferBit); 
    GL.UseProgram(shader.glProgram); 

    GL.UniformMatrix4(shader.GetUniform(Shader.UNIFORMS_T.MODEL_VIEW_PROJECTION), 1, false, ref modelViewProjection.Row0.X); 
    GL.Uniform3(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), 1, 1, 1); 

    lattice.Draw(); 

    SwapBuffers(); 
} 

Rendu partie 2:

public void Draw() 
    { 
     //Update Uniform 
     GL.Uniform2(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_POSITION), 1, ref m_vec2Position.X); 
     GL.Uniform3(shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), 1, 1, 1); 

     var colVal = new Vector3(-1, -1, -1); //becomes 0, 0, 0 
     var posVal = new Vector2(-1, -1);  //becomes arbitrary value 
     GL.GetUniform(shader.glProgram, shader.GetUniform(Shader.UNIFORMS_T.OBJECT_COLOR), ref colVal.X); 
     GL.GetUniform(shader.glProgram, shader.GetUniform(Shader.UNIFORMS_T.OBJECT_POSITION), ref posVal.X); 

     // Update attribute values. 
     GL.BindBuffer(All.ArrayBuffer, glVBO); 
     GL.VertexAttribPointer((int)Shader.ATTRIBUTES_T.VERTEX_POSITION, 3, All.Float, false, sizeof(float) * 3, IntPtr.Zero); 
     GL.EnableVertexAttribArray((int)Shader.ATTRIBUTES_T.VERTEX_POSITION); 

     GL.BindBuffer(All.ElementArrayBuffer, glVBI); 
     GL.DrawElements(All.LineStrip, Indices.Length, All.UnsignedShort, IntPtr.Zero); 

     GL.BindBuffer(All.ArrayBuffer, 0); 
     GL.BindBuffer(All.ElementArrayBuffer, 0); 
    } 

Je suis le plus probable chanter quelque chose de trivial mais je n'arrive pas à le trouver ... Utiliser Xamarin avec Android.

Répondre

0

Peu importe, il semble que la surcharge GL.Uniform * qui prend des valeurs individuelles au lieu de référence ne fonctionne pas au moins dans OpenGLES20.