NahuelLazarte / 2024-2C-3551-RenderCores

Plantilla para realizar el trabajo práctico de TGC en la UTN-FRBA.
MIT License
0 stars 0 forks source link

Recopilaciones #3

Open NahuelLazarte opened 2 months ago

NahuelLazarte commented 2 months ago

Chequear lo que hay acá, está relacionado, pero no estoy seguro que sea correcto

foreach (var mesh in Model.Meshes)
            {
                // Un mesh puede tener mas de 1 mesh part (cada 1 puede tener su propio efecto).
                foreach (var meshPart in mesh.MeshParts)
                {
                    meshPart.Effect = Effect;
                }
            }

Effect

            Effect.Parameters["View"].SetValue(View);
            Effect.Parameters["Projection"].SetValue(Projection);
            Effect.Parameters["DiffuseColor"].SetValue(Color.DarkBlue.ToVector3());
// En el juego no pueden usar BasicEffect de MG, deben usar siempre efectos propios.
            Effect = Content.Load<Effect>(ContentFolderEffects + "BasicShader");

Patrón de diseño

Archivo

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace TGC.MonoGame.TP
{
    public class Quad : IDisposable
    {
        private VertexBuffer _vertexBuffer; //clase de MonoGame
        private IndexBuffer _indexBuffer; //clase de MonoGame

        public void LoadContent(GraphicsDevice graphicsDevice)
        {
            //Crear el Quad
            var vertices = new VertexPositionColor[4]
            {
            new VertexPositionColor(new Vector3(-1.0f,-1.0f,0f), Color.Red),
            new VertexPositionColor(new Vector3(-1.0f,1.0f,0f), Color.Green),
            new VertexPositionColor(new Vector3(1.0f,-1.0f,0f), Color.Yellow),
            new VertexPositionColor(new Vector3(1.0f,1.0f,0f), Color.Blue)
            };

            // int = 32 bits
            // short = 16 bits
            // short sin signo = ushort
            var indices = new ushort[6]
            {
            //Primer trinagulo
            0,1,3,
            //Segundo triangulo
            0,2,3,
            };

            _vertexBuffer = new VertexBuffer(graphicsDevice, VertexPositionColor.VertexDeclaration, 4, BufferUsage.None);//un quad tiene 6 vertices si los triangulos son individuales, pero nosotros queremos juntar esos triangulos. Es mejor hacerlo así para trabajar con los dos juntos y es menos costoso para la placa de video
            _vertexBuffer.SetData(vertices);// un vertice tiene una posicion, color, la normal y coordenada de textura
            _indexBuffer = new IndexBuffer(graphicsDevice, IndexElementSize.SixteenBits, 6, BufferUsage.None); //el index buffer apunta a los vertices y tiene que decir cómo hacer los triangulos
            _indexBuffer.SetData(indices);
        }
        public void Draw(Effect effect)
        {
            //sacado se samples, GeometricPrimiteve, del método Draw
            var graphicsDevice = effect.GraphicsDevice;
            //Set our vertex declaration, vertex buffer, and index buffer.
            graphicsDevice.SetVertexBuffer(_vertexBuffer);
            graphicsDevice.Indices = _indexBuffer;

            foreach (var effectPass in effect.CurrentTechnique.Passes)
            { // después vamos a ver qué es una pasada
                effectPass.Apply();
                int primitiveCount = 2;
                graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, primitiveCount); // hay más tipos de primitivas en el min  50:00 lo explica
            }
        }
        public void Dispose()
        {   // implementación de la interfaz que la clase hereda
            _vertexBuffer.Dispose();
            _indexBuffer.Dispose();
        }
    }
}

Llamada en TGCGame : Game

protected override void LoadContent()
{ // .....
    _quad = new Quad();
    _quad.LoadContent(GraphicsDevice);
     base.LoadContent();
}
 protected override void UnloadContent()
{
    _quad.Dispose();
    base.UnloadContent();
}

protected override void Draw(GameTime gameTime)
{
  Effect.Parameters["World"].SetValue(Matrix.Identity);
  Effect.Parameters["View"].SetValue(View);
  Effect.Parameters["Projection"].SetValue(Projection);
  Effect.Parameters["DiffuseColor"].SetValue(Color.DarkBlue.ToVector3());
  _quad.Draw(Effect);
}
NahuelLazarte commented 2 months ago

image Esto sirve para modificar la vista. Cambiando la cámara, ejemplo,

View = Matrix.CreateLookAt(Vector3.One * 10, Vector3.Zero, Vector3.Up);

Se puede hacer que se ve el objeto desde otro lugar

NahuelLazarte commented 2 months ago

image Con eso se cambia el color, habría que modificar DarkBlue por otra cosa

NahuelLazarte commented 2 months ago

image Para dibujar el objeto con opacidad