基本的矩阵变换主要包括两个
glMatrixMode(GL_PROJECTION) 设置投影变换
投影变换主要包括使用 perspective 还是 ortho 投影.
glMatrixMode(GL_MODELVIEW) 设置 model view 变换.
modelview 变换主要包括 view变化,类似 gluLookAt()设置camera 位置&朝向&旋转,
和设置各个待绘制物体的 translation,rotation,scale.
同一帧渲染中,可以通过修改投影变换的方式( perspective/ortho ),来进行混合3d 2d的渲染.
即使都是3d 渲染,也可以通过临时修改 view 变换矩阵,绘制另外一些物体,然后再恢复回来继续绘制,来达到一些特殊的效果.
代码
#include<iostream>
#include<gl/glut.h>
#define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES);\
glVertex2f((x1),(y1)); glVertex2f((x2),(y2)); glEnd();
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel( GL_FLAT );
}
void display()
{
int i;
glClear( GL_COLOR_BUFFER_BIT );
// render 3d
glMatrixMode( GL_PROJECTION );
gluPerspective( 60,2.0f,0.00001,1000.0);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt( 0,0,10, 0,0,0, 0,1,0);
glColor3f( 1.0f,1.0f,0.0f);
::glutWireCube( 1.0f);
// render 2d
glMatrixMode( GL_PROJECTION);
glLoadIdentity();
gluOrtho2D( 0.0,(GLdouble)800,0.0,(GLdouble)600);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glColor3f( 1.0f,0.0f,0.0f);
glBegin( GL_POLYGON);
glVertex2f( 0,0);
glVertex2f( 500,0);
glVertex2f( 0,500);
glEnd();
glFlush();
}
void reshape( int w,int h)
{
glViewport( 0,0,(GLsizei)w,(GLsizei)h);
}
int main( int argc,char** argv)
{
glutInit( &argc,argv);
glutInitDisplayMode( GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(800,600);
glutCreateWindow( "ogl1");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
}
效果
后面的黄色 wire cube 是 3d 透视投影渲染出来的
前面红色的三角形是 2d 正交投影渲染出来的