ন্যূনতম উদাহরণ যা কীভাবে glNormal
ছড়িয়ে পড়া বাজ নিয়ে কাজ করে তার কিছু বিশদ চিত্রিত করে।
display
ফাংশনের মন্তব্যগুলি প্রতিটি ত্রিভুজটির অর্থ কী তা ব্যাখ্যা করে।
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
/* Triangle on the x-y plane. */
static void draw_triangle() {
glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 0.0f);
glEnd();
}
/* A triangle tilted 45 degrees manually. */
static void draw_triangle_45() {
glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f( 1.0f, -1.0f, 0.0f);
glEnd();
}
static void display(void) {
glColor3f(1.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
/*
Triangle perpendicular to the light.
0,0,1 also happens to be the default normal if we hadn't specified one.
*/
glNormal3f(0.0f, 0.0f, 1.0f);
draw_triangle();
/*
This triangle is as bright as the previous one.
This is not photorealistic, where it should be less bright.
*/
glTranslatef(2.0f, 0.0f, 0.0f);
draw_triangle_45();
/*
Same as previous triangle, but with the normal set
to the photorealistic value of 45, making it less bright.
Note that the norm of this normal vector is not 1,
but we are fine since we are using `glEnable(GL_NORMALIZE)`.
*/
glTranslatef(2.0f, 0.0f, 0.0f);
glNormal3f(0.0f, 1.0f, 1.0f);
draw_triangle_45();
/*
This triangle is rotated 45 degrees with a glRotate.
It should be as bright as the previous one,
even though we set the normal to 0,0,1.
So glRotate also affects the normal!
*/
glTranslatef(2.0f, 0.0f, 0.0f);
glNormal3f(0.0, 0.0, 1.0);
glRotatef(45.0, -1.0, 0.0, 0.0);
draw_triangle();
glPopMatrix();
glFlush();
}
static void init(void) {
GLfloat light0_diffuse[] = {1.0, 1.0, 1.0, 1.0};
/* Plane wave coming from +z infinity. */
GLfloat light0_position[] = {0.0, 0.0, 1.0, 0.0};
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
}
static void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 7.0, -1.0, 1.0, -1.5, 1.5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 200);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return EXIT_SUCCESS;
}
তত্ত্ব
ওপেনজিএলে প্রতিটি ভার্টেক্সের নিজস্ব সম্পর্কিত সাধারণ ভেক্টর রয়েছে।
সাধারণ ভেক্টরটি নির্ধারণ করে যে ভার্টেক্সটি কতটা উজ্জ্বল, যা ত্রিভুজটি কতটা উজ্জ্বল তা নির্ধারণের জন্য ব্যবহৃত হয়।
যখন কোনও পৃষ্ঠ আলোর জন্য লম্ব হয় তখন এটি সমান্তরাল পৃষ্ঠের চেয়ে উজ্জ্বল থাকে।
glNormal
বর্তমানের সাধারণ ভেক্টর সেট করে যা নীচের সমস্ত ভার্টেক্সগুলির জন্য ব্যবহৃত হয়।
স্বাভাবিক জন্য প্রারম্ভিক মান আগে আমরা সব glNormal
হয় 0,0,1
।
সাধারণ ভেক্টরগুলির অবশ্যই আদর্শ 1 থাকতে হবে , অন্যথায় রঙ পরিবর্তন হয়! glScale
স্বাভাবিকের দৈর্ঘ্যও বদলে দেয়! glEnable(GL_NORMALIZE);
ওপেনজিএল আমাদের জন্য স্বয়ংক্রিয়ভাবে তাদের আদর্শ 1 এ সেট করে। এই জিআইএফ এটি সুন্দরভাবে চিত্রিত করে।
বিবলিওগ্রাফি: