Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I'm having some problem to draw textures with class "DrawUserIndexPrimitive" on Xna.

I can draw my cubes / models without problem. But I want to draw different textures on my cubes. I loop on each "ID" of a different texture applied to my different cube. But it does not work. I apply every time buffer and vertexPosition with IndexBuffer different from my class "GraphicData."

the final texture to be applied is the same on all my cubes

thank you

Here is my code for function "Draw"

public void drawWorld(GameTime gameTime) 
    { 
        if (needToDraw) 
        { 
            int index = 0; 
            foreach (GraphicData data in graphicData) 
            { 

                effet.LightingEnabled = false; 
                effet.VertexColorEnabled = false; 
                effet.TextureEnabled = true; 
                effet.FogEnabled = false; 
                effet.FogStart = arcadia.camera.NearPlane; 
                effet.FogEnd = arcadia.camera.FarPlane; 
                effet.FogColor = new Vector3(1, 1, 1); 
                effet.View = arcadia.camera.View; 
                effet.Projection = arcadia.camera.Projection; 

                if (index == 0) 
                { 
                    effet.Texture = Game.Content.Load<Texture2D>("Models\\Ground\\Land\\ground_land_text1"); 
                } 
                else 
                { 
                    effet.Texture = Game.Content.Load<Texture2D>("Models\\Ground\\Land\\ground_land_text2"); 
                } 
                foreach (EffectPass pass in effet.CurrentTechnique.Passes) 
                { 
                    pass.Apply(); 
                    //Initialize et envoie à la carte graphique le buffer et les vertices 
                    if (data.vertexBuffer != null && data.indexBuffer != null) 
                    { 
                        Game.GraphicsDevice.SetVertexBuffer(data.vertexBuffer); 
                        Game.GraphicsDevice.Indices = data.indexBuffer; 
                        Game.GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, data.vertexPosition, 0, data.vertexPosition.Length, data.indices, 0, data.indices.Length / 3); 
                    } 

                } 
                index++; 
            } 
        } 


    } 
share|improve this question
    
Im not 100% sure, but maybe try using a single effect for every object. If the whole thing is batched the actual draw will happen AFTER you changed the effect back and forth and therefore only apply the last texture set. –  floAr Mar 22 '13 at 9:45
    
That seems like a good idea! I'll try it for lunch and back to keep you informed of the results! –  Mehdi Bugnard Mar 22 '13 at 9:58
    
Yes I have tried now but unfortunately it does not change anything ...To believe that I really have no chance. Only the last texture is applied everywhere –  Mehdi Bugnard Mar 22 '13 at 12:02
add comment

1 Answer

up vote 1 down vote accepted

I used this in a similar situation (drawing a cube, each side with a different texture) and the texture changes properly. It's probably a little sloppy but it works:

        effect.Texture = someTexture; 
        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {                                             
            pass.Apply();
            mainRoom.DrawFace(GraphicsDevice, frontFaceVertices);
        }

        effect.Texture = someDifferentTexture;
        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {                
            pass.Apply();
            mainRoom.DrawFace(GraphicsDevice, backFaceVertices);
        }

//where .DrawFace draws the vertices
    public void DrawFace(GraphicsDevice device, VertexPositionNormalTexture[] vertices)
    {
        // Create the shape buffer and dispose of it to prevent out of memory
        using (VertexBuffer buffer = new VertexBuffer(device, VertexPositionNormalTexture.VertexDeclaration, NUM_VERTICES, BufferUsage.WriteOnly))
        {
            buffer.SetData(vertices);
            device.SetVertexBuffer(buffer);
            device.SamplerStates[0] = SamplerState.LinearClamp;
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, NUM_TRIANGLES_PER_FACE);
        }
    }

Instead of using the index to check which texture to use, provide your data class with the index of a texture to draw, and use an if statement to determine which texture should be drawn.

Also, loading textures is very slow, it is much better to load them once into a variable.

share|improve this answer
    
Thank you very much for this example well explained. Exactly what I expected as an example. This is perfect –  Mehdi Bugnard Apr 3 '13 at 6:44
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.