02 - Primer renderizado, dibujando triangulos

En el artículo anterior ya comentábamos que las instrucciones de dibujo se deben escribir entre las instrucciones de Begin() y End().

La forma más básica de dibujo es definiendo los vertices de las formas directamente. Por defecto, los vertices definen triangulos, de manera que cada 3 vertices definidos forman un triangulo.



De esta manera, el código:


GL.Vertex3(0.0f, 0.2f, 0.0f);
GL.Vertex3(-0.2f, -0.2f, 0.0f);
GL.Vertex3(0.2f, -0.2f, 0.0f);

Dibujaría un triangulo con los vertices en (0, 0.2, 0), (-0.2, -0.2, 0), (0.2, -0.2, 0) de color blanco porque no hemos definido ningún color. Para hacerlo debemos usar la instrucción Color3(), como por ejemplo:


GL.Color3(Color.Red);
GL.Vertex3(0.0f, 0.2f, 0.0f);
GL.Color3(Color.Yellow);
GL.Vertex3(-0.2f, -0.2f, 0.0f);
GL.Color3(Color.Green);
GL.Vertex3(0.2f, -0.2f, 0.0f);

Con este código habremos dibujado un triangulo con tres colores, uno en cada vértice.
Si seguimos jugando podemos dibujar un segundo triangulo:


GL.Color3(Color.Gold);
GL.Vertex3(0.1f, 0.2f, -0.1f);
GL.Color3(Color.Magenta);
GL.Vertex3(-0.1f, -0.2f, 0.1f);
GL.Color3(Color.Lime);
GL.Vertex3(0.3f, -0.2f, 0.1f);

Ahora vemos un segundo triangulo superpuesto al anterior, pero si miramos las coordenadas de los dos triangulos, el segundo debería cruzar al primero, no renderizarse encima, esto es debido a que se está dibujando en el orden que se envían las instrucciones. Si quisiéramos que se dibujara correctamente, deberíamos activar el test de profundidad (DepthTest) para que OpenGL compruebe que pixel esta arriba de todos los que se han dibujado en un mismo punto. Para hacer esto:

GL.Enable(EnableCap.DepthTest);

Esta información se guarda en el buffer de profundidad o DepthBuffer por eso lo incluimos en el Clear de cada bucle de renderizado.

Con estas instrucciones ya puedes dibujar tantos triángulos como quieras.

2 comentarios:

  1. Da una alegría cuando ves que tu primera figura cobra vida jaja ya se como se siente una embarazada xD

    Dejo por si interesa un Cubo en 3D, se ve mejor cuando lo rotas sobre sí mismo, es un pasote.

    // Frente
    GL.Color3(Color.Orange);
    GL.Vertex3(-0.5f, 0.5f, 0.5f);
    GL.Vertex3(-0.5f, -0.5f, 0.5f);
    GL.Vertex3(0.5f, -0.5f, 0.5f);
    GL.Vertex3(0.5f, 0.5f, 0.5f);

    // Atras
    GL.Color3(Color.Blue);
    GL.Vertex3(-0.5f, 0.5f, -0.5f);
    GL.Vertex3(-0.5f, -0.5f, -0.5f);
    GL.Vertex3(0.5f, -0.5f, -0.5f);
    GL.Vertex3(0.5f, 0.5f, -0.5f);

    // Derecha
    GL.Color3(Color.Lime);
    GL.Vertex3(0.5f, 0.5f, -0.5f);
    GL.Vertex3(0.5f, -0.5f, -0.5f);
    GL.Vertex3(0.5f, -0.5f, 0.5f);
    GL.Vertex3(0.5f, 0.5f, 0.5f);

    // Izquierda
    GL.Color3(Color.Magenta);
    GL.Vertex3(-0.5f, 0.5f, -0.5f);
    GL.Vertex3(-0.5f, -0.5f, -0.5f);
    GL.Vertex3(-0.5f, -0.5f, 0.5f);
    GL.Vertex3(-0.5f, 0.5f, 0.5f);

    // Arriba
    GL.Color3(Color.Cyan);
    GL.Vertex3(-0.5f, 0.5f, -0.5f);
    GL.Vertex3(-0.5f, 0.5f, 0.5f);
    GL.Vertex3(0.5f, 0.5f, 0.5f);
    GL.Vertex3(0.5f, 0.5f, -0.5f);

    // Abajo
    GL.Color3(Color.Yellow);
    GL.Vertex3(-0.5f, -0.5f, -0.5f);
    GL.Vertex3(-0.5f, -0.5f, 0.5f);
    GL.Vertex3(0.5f, -0.5f, 0.5f);
    GL.Vertex3(0.5f, -0.5f, -0.5f);

    ResponderEliminar
  2. Estoy empezando con OpenGl en C#, me ayudaría mucho saber donde es que pones el código de arriba.

    ResponderEliminar