Can it be possible rendering multiple objects in one screen without creating shader in OpenGL?

406 Views Asked by At

My course teacher taught me how to draw a figure e.g. square, triangle, circle. He did it using glBegin and glEnd. But when I try to draw multiple object for example circle within a square, I can't. After searching in online, I understood that shader is the thing that need to implement to draw or control how the objects will be rendered.

But as my course teacher didn't teach me shader, is there any possible way to do that using legacy OpenGL I mean with glBegin and glEnd?

I am using Codeblocks and GLUT to learn OpenGL. And the language I am using is C++.

The code I wrote to draw only circles and that worked:

#include<GL/gl.h>
#include<windows.h>
#include <stdio.h>
#include <math.h>
#include <GL/glut.h>

// Center of the cicle = (320, 240)
int xc = 320, yc = 240;

// Plot eight points using circle's symmetrical property
void plot_point(int x, int y)
{
  glBegin(GL_POINTS);
  glVertex2i(xc+x, yc+y);
  glVertex2i(xc+x, yc-y);
  glVertex2i(xc+y, yc+x);
  glVertex2i(xc+y, yc-x);
  glVertex2i(xc-x, yc-y);
  glVertex2i(xc-y, yc-x);
  glVertex2i(xc-x, yc+y);
  glVertex2i(xc-y, yc+x);
  glEnd();
}

// Function to draw a circle using bresenham's
// circle drawing algorithm
void mid_point_circle(int r)
{
  int x=0,y=r;
  float pk=(5.0/4.0)-r;

  /* Plot the points */
  /* Plot the first point */
  plot_point(x,y);
  int k;
  /* Find all vertices till x=y */
  while(x < y)
  {
    x = x + 1;
    if(pk < 0)
      pk = pk + 2*x+1;
    else
    {
      y = y - 1;
      pk = pk + 2*(x - y) + 1;
    }
    plot_point(x,y);
  }
  glFlush();
}

// Function to draw two concentric circles
void concentric_circles(void)
{
  /* Clears buffers to preset values */
  glClear(GL_COLOR_BUFFER_BIT);

  int radius1 = 100, radius2 = 200;
  mid_point_circle(radius1);
  mid_point_circle(radius2);
}

void Init()
{
  /* Set clear color to white */
  glClearColor(1.0,1.0,1.0,0);
  /* Set fill color to black */
  glColor3f(0.0,0.0,0.0);
  /* glViewport(0 , 0 , 640 , 480); */
  /* glMatrixMode(GL_PROJECTION); */
  /* glLoadIdentity(); */
  gluOrtho2D(0 , 640 , 0 , 480);
}

int main(int argc, char **argv)
{
  /* Initialise GLUT library */
  glutInit(&argc,argv);
  /* Set the initial display mode */
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  /* Set the initial window position and size */
  glutInitWindowPosition(0,0);
  glutInitWindowSize(640,480);
  /* Create the window with title "Mid-point Circle" */
  glutCreateWindow("Mid-point Circle");
  /* Initialize drawing colors */
  Init();
  /* Call the displaying function */
  glutDisplayFunc(concentric_circles);
  /* Keep displaying untill the program is closed */
  glutMainLoop();
  return 0;
}
1

There are 1 best solutions below

0
Rabbid76 On

Rendering "multiple objects" doesn't depend on whether you're using a shader program or not. For multiple different objects, you need to make multiple draw calls or implement multiple glBegin/glEnd sequences.
For each draw call or each glBegin/glEnd sequences you must specify the type of the Primitives:

glBegin(GL_LINES);
// [...]
glEnd();

glBegin(GL_TRIANGLES);
// [...]
glEnd();