2016-03-02 3 views
0

У меня возникли проблемы с конвейером шейдеров OpenGLES. У меня есть шейдер с 3 мундирахНекоторые формы работы другие не

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 и positionObject работы просто отлично, однако при попытке получить фрагмент шейдера на работу я заметил, что objectColor ничего не делает, поэтому я попытался экспериментировать в вершинном шейдере, а затем в конце концов, выяснилось, что он всегда оставался начальное значение независимо от того, в каком порядке оно определено, какой тип оно, это имя и т.д.

я после стандартной процедуры шейдера трубопровода:

компилирования -> linking -> use program -> get location -> initia Лизе равномерной

и равномерная objectColor даже получает идентификатор, будучи активным равномерным и подсчитано к активной форме, однако всякий раз, когда я пытаюсь изменить это значение всегда остается на нуле.

Вот отрывки кода:

Равномерное расположение:

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"); 
} 

Rendering часть 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(); 
} 

Rendering часть 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); 
    } 

Я скорее всего, неправильно петь что-то тривиальное, но я не могу найти его ... Использование Xamarin с Android.

ответ

0

Ничего лишнего, кажется, что перегрузка GL.Uniform *, которая принимает отдельные значения вместо ссылки напрямую, не работает, по крайней мере, в OpenGLES20.