title: Reusing pixels shaders with different uniform parameters in iOS metal
body: <p>I'm having a problem reusing my metal pixel and vertex shaders across different objects with different uniform parameters.  I'm guessing its got something to do with my using my command buffer incorrectly.</p>
  
  <p>When I run my metal application, the geometry draw correctly, but only the uniforms for the final call to </p>
  
  <p><code>renderCommand setFragmentBuffer:uniform_info offset:0 atIndex:UNIFORM_INFO_BUFFER_INDEX];</code></p>
  
  <p>Seems to write data to the pixel shader.</p>
  
  <p>I've cut-n-pasted (and edited) my render loop here.  I'm looking for an example of how to reuse my pixel shader multiple times during a single render pass with different uniforms passed in.</p>
  
  <pre><code>  CAMetalLayer *metalLayer = [metal_info.g_iosMetalView getMetalLayer];
  
    id &lt;CAMetalDrawable&gt; frameDrawable;
    while (!frameDrawable){
       frameDrawable = [metalLayer nextDrawable];
    }
    MTLRenderPassDescriptor *mtlRenderPassDescriptor;
    mtlRenderPassDescriptor = [MTLRenderPassDescriptor new];
    mtlRenderPassDescriptor.colorAttachments[0].texture = frameDrawable.texture;
    mtlRenderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionLoad;
    mtlRenderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0.0, 0.0, 1.0, 1.0);
  
    mtlRenderPassDescriptor.depthAttachment.texture = metal_info.g_depthTexture;
    mtlRenderPassDescriptor.depthAttachment.loadAction = MTLLoadActionClear;
    mtlRenderPassDescriptor.depthAttachment.storeAction = MTLStoreActionStore;
    mtlRenderPassDescriptor.depthAttachment.clearDepth = 1.0;
  
    // Create My one and only command buffer
    id &lt;MTLCommandBuffer&gt; mtlCommandBuffer = [metal_info.g_commandQueue commandBuffer];
  
    int n = RendererInfo.fact.GetActiveCount();
  
    // loop through all the objects I have (I'm having trouble with 2)
    Object* curObj = NULL;
    for (int obj_i = 0 ; obj_i &lt; n ; ++obj_i)
    {
       // create one render encoder for each object
       id &lt;MTLRenderCommandEncoder&gt; renderCommand = [mtlCommandBuffer renderCommandEncoderWithDescriptor: mtlRenderPassDescriptor];
  
       memcpy([metal_info.g_projectionMatrix contents], &amp;metal_info.g_Projection, sizeof(Matrix4f));         
       Matrix4f *view = RendererInfo.cam-&gt;GetViewMatrix();
       memcpy([metal_info.g_viewMatrix contents], view, sizeof(Matrix4f));
  
       [renderCommand setFrontFacingWinding:MTLWindingCounterClockwise];
       [renderCommand setCullMode:MTLCullModeBack]; 
  
       [renderCommand setViewport: (MTLViewport){ 0.0, 0.0,
          (double)metal_info.g_metal_width,
          (double)metal_info.g_metal_height,
          0.0, 1.0 }];
  
       [renderCommand setRenderPipelineState:metal_info.g_pipelineState];
       [renderCommand setDepthStencilState:metal_info.g_depthState];
  
  
       curObj = RendererInfo.fact.GetObjectAtIndex(obj_i);
  
       id&lt;MTLBuffer&gt; vertices = curObj-&gt;GetVertexBuffer();
       id&lt;MTLBuffer&gt; indicies = curObj-&gt;GetIndexBuffer();         
       int indexCount = curObj-&gt;GetIndexCount();
  
       id &lt;MTLTexture&gt; texture = objTexture-&gt;GetAsset();
       [renderCommand setFragmentTexture:texture atIndex:0];         
  
       memcpy([metal_info.g_shaderUniformInfo contents], curObj-&gt;GetUniformInfo(), curObj-&gt;curObj-&gt;GetUniformInfoSize());
  
       [renderCommand setVertexBuffer:vertices                       offset:0 atIndex:VERTICES__INDEX];
       [renderCommand setVertexBuffer:metal_info.g_viewMatrix        offset:0 atIndex:VIEW_MATRIX_BUFFER_INDEX];
       [renderCommand setVertexBuffer:metal_info.g_projectionMatrix  offset:0 atIndex:PROJECTION_MATRIX_BUFFER_INDEX];
  
       [renderCommand setFragmentBuffer:metal_info.g_shaderUniformInfo  offset:0 atIndex:UNIFORM_INFO_BUFFER_INDEX];
  
       [renderCommand drawIndexedPrimitives:MTLPrimitiveTypeTriangle
                                 indexCount:indexCount
                                 indexType:MTLIndexTypeUInt32
                               indexBuffer:indicies
                         indexBufferOffset:0];
  
       [renderCommand endEncoding];
    }
    [mtlCommandBuffer presentDrawable:frameDrawable];
    [mtlCommandBuffer commit];
  </code></pre>
  
  <p>I can also post the pixel shader if you want, but when I've coded to only render one object at a time, the shader works correctly.</p>