OpenGL: 反走樣
阿新 • • 發佈:2019-01-08
#include <gl/glut.h> #pragma comment(lib, "glut32.lib") #define NO 0 #define YES 1 int Drawing; void Initialization() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA); glEnable(GL_POINT_SMOOTH); //啟用點反走樣 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); glEnable(GL_LINE_SMOOTH); //啟用直線反走樣,初始化函式中所呼叫的那3條命令才真正起作用 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); Drawing=NO; } void OnDisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if(Drawing == YES) //啟用混合狀態,初始化函式中所呼叫的那3條命令才真正起作用 { glEnable(GL_BLEND); } else //關閉混合狀態 { glDisable(GL_BLEND); } glColor4f(1.0f, 0.0f, 0.0f, 1.0f); //當前繪圖色為綠色 glLineWidth(10); glBegin(GL_LINE_STRIP); { glVertex2f(-3.0f, -0.5f); glVertex2f(0.0f, 0.5f); glVertex2f(3.0f, -0.5f); } glEnd(); glPointSize(10); glBegin(GL_POINTS); { glVertex2f(0.0f, 1.0f); } glEnd(); glutSwapBuffers(); } void OnReShape(int w,int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); //將當前矩陣指定為投影模式 glLoadIdentity(); if (h!=0) { GLfloat aspect = (float)w / (float)h; if(w < h) { gluOrtho2D(-3, 3, -3 * aspect, 3 * aspect); } else { gluOrtho2D(-3 / aspect, 3 / aspect, -3, 3); } } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CreateMenu(void) { glutAddMenuEntry("正常顯示", NO); glutAddMenuEntry("反走樣", YES); glutAttachMenu(GLUT_RIGHT_BUTTON); } void OnMenu(int value) { Drawing = value; glutPostRedisplay(); } void main(int argc,char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(600, 480); glutCreateWindow("OpenGL反走樣"); glutReshapeFunc(OnReShape); glutDisplayFunc(OnDisplay); glutCreateMenu(OnMenu); Initialization(); CreateMenu(); glutMainLoop(); }
執行效果如下: