`
huozheleisi
  • 浏览: 1234124 次
文章分类
社区版块
存档分类
最新评论

OpenGL的特殊效果

 
阅读更多

OPENGL的特殊效果
1 融合 
	前面从未接触过透明或半透明的物体,因为我们从未启用过融合处理 
所谓融合就是假设在RGBA模式下,源色为(Rs,Gs,Bs,As),目标色为 
(Rd,Gd,Bd,Ad),源因子为(Sr,Sg,Sb,Sa),目的因子为(Dr,Dg,Db,Da) 
则融合的最终效果为:(Rs*Sr+Rd*Dr,Gs*Sg+Gd*Dg,Bs*Sb+Bd*Db,As*Sa+Ad*Da) 
然后再归一。公式挺复杂,不过仔细看看,跟平常的融合倒是定性一致。 
关键就是如何设定融合因子(Sr,Sg,Sb,Sa)(Dr,Dg,Db,Da)来实现不同的融合效果 
利用函数: 
void glBlendFunc(GLenum sfactor,GLenum dfactor); 
其中两个参数可以取下面值: 
 
取值                       		相关因子             计算后融合因子 
GL_ZERO                    	源、目的             (0,0,0,0) 
GL_ONE                     	源、目的             (1,1,1,1) 
GL_DST_COLOR               		(Rd,Gd,Bd,Ad) 
GL_SRC_COLOR               	目的                 	(Rs,Gs,Bs,As) 
GL_ONE_MINUS_DST_COLOR     源                 (1,1,1,1)-(Rd,Gd,Bd,Ad) 
GL_ONE_MINUS_SRC_COLOR     目的              (1,1,1,1)-(Rs,Gs,Bs,As) 
GL_SRC_ALPHA               	源、目的             (As,As,As,As) 
GL_ONE_MINUS_SRC_ALPHA     源、目的          (1,1,1,1)-(As,As,As,As) 
GL_DST_ALPHA               	源、目的             (Ad,Ad,Ad,Ad) 
GL_ONE_MINUS_DST_ALPHA     源、目的          (1,1,1,1)-(Ad,Ad,Ad,Ad) 
GL_SRC_ALPHA_SATURATE      源                   (f,f,f,1)-min(As,1-Ad) 
 
还要利用glEnable(GL_BLEND) glDisable(gl_blend)来启用、关闭融合处理。 
//////////////////////////////////////////////// 
//sample.cpp 
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA

void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
 
 
void myinit(void) 
{ 
 
        auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        auxInitPosition(0,0,500,500); 
        auxInitWindow("sample1"); 
        glClearColor(0.0,0.0,0.0,0.0); 
        glClear(GL_COLOR_BUFFER_BIT); 
 
//设置融合效果并启用 
        glEnable(GL_BLEND); 
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
//      glDepthFunc(GL_LESS); 
//      glEnable(GL_DEPTH_TEST); 
        glShadeModel(GL_FLAT); 
} 
 
void CALLBACK reshape(GLsizei w,GLsizei h) 
{ 
        glViewport(0,0,w,h); 
        glMatrixMode(GL_PROJECTION); 
        glLoadIdentity(); 
        if(w<=h) 
                gluOrtho2D(0.0,1.0,0.0,1.0*(GLfloat)h/(GLfloat)w); 
        else 
                gluOrtho2D(0.0,1.0*(GLfloat)w/(GLfloat)h,0.0,1.0); 
        glMatrixMode(GL_MODELVIEW); 
} 
 
void CALLBACK display(void) 
{ 
 
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
 
//三个不同颜色和透明度的方块重合,颜色融合的效果 
  glColor4f(1.0,0.0,0.0,0.7); 
  glRectf(0.25,0.4,0.75,0.9); 
 
  glColor4f(0.0,1.0,0.0,1.0); 
  glRectf(0.1,0.1,0.6,0.6); 
   
  glColor4f(0.0,0.0,1.0,0.3); 
  glRectf(0.4,0.1,0.9,0.6); 
 
  glFlush(); 
 
} 
void main(void) 
{ 
    myinit(); 
     
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 
} 
//end of sample 
///////////////////////////////////////////////////////// 
你可以试试调节参数大小,体会一下个参数的含义。 
 
2 反走样Anti-aliasing 
由于计算机以离散点生成图形,生成图形必然与真实景物存在差距,这种差距 
表现为:直线或光滑曲面的锯齿、花纹失去原有色彩形状、细小物体在画面的 
消失等。统统叫做走样。反走样可以减少这种情况。粗略设想一下,就是把原 
来边界的地方锯齿部分用低饱和度的点补上,这样既不影响整体轮廓,又获得 
较好的平滑效果。反走样前提供“提示”采用函数: 
 
void glHint(GLenum target,GLenum hint); 
其中hint可以是:GL_FASTEST 给出最有效的选择 
                GL_NICEST  给出最高质量的选择 
                GL_DONT_CARE 没有选择 
 
target                            意义 
 
GL_POINT_SMOOTH_HINT              指定点、 
GL_LINE_SMOOTH_HINT               线、 
GL_POLYGON_SMOOTH_HINT            多边形的采样质量 
 
GL_FOG_HINT                       指出雾化计算是按每个象素进行(GL_NICEST) 
                                  还是按每个顶点进行(GL_FASTEST) 
 
GL_PERSPECTIVE_CORRECTION_HINT    指定颜色纹理插值的质量 
其中GL_PERSPECTIVE_CORRECTION_HINT用以纠正单纯线性插值带来的观察错误。 
 
当然最主要的工作还是glEnable()来完成的。 
 
先给出一个点、线反走样的例子。需要说明的是这个工作最好在RGBA模式下进行, 
首先利用glEnable()(参数为GL_POINT_SMOOTH GL_LINE_SMOOTH或 
GL_POLYGON_SMOOTH)启用反走样。在RGBA模式下启用反走样,必须启用融合处理。 
而且最常用的融合因子分别是:GL_SRC"javascript:if(confirm('http://ins22web.seu.edu.cn/xuray/netschool/support/opengl/_ALPHA(源)和GL_ONE_MINUS_SRC_ALPHA  /n/nThis file was not retrieved by Teleport Pro, because it was unavailable, or its retrieval was aborted, or the project was stopped too soon.  /n/nDo you want to open it from the server?'))window.location='http://ins22web.seu.edu.cn/xuray/netschool/support/opengl/_ALPHA%A3%A8%D4%B4%A3%A9%BA%CDGL_ONE_MINUS_SRC_A"javascript:if(confirm('http://ins22web.seu.edu.cn/xuray/netschool/support/opengl/LPHA/'"  /n/nThis file was not retrieved by Teleport Pro, because it was unavailable, or its retrieval was aborted, or the project was stopped too soon.  /n/nDo you want to open it from the server?'))window.location='http://ins22web.seu.edu.cn/xuray/netschool/support/opengl/LPHA%27%22'" tppabs="http://ins22web.seu.edu.cn/xuray/netschool/support/opengl/LPHA%27%22" 
或GL_ONE(目的)。 
 
/////////////////////////////////////////////////////////////////////// 
//sample.cpp 
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA
void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
 
void myinit(void) 
{ 
 
        auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        auxInitPosition(0,0,500,500); 
        auxInitWindow("sample1"); 
        glClearColor(0.0,0.0,0.0,0.0); 
        glClear(GL_COLOR_BUFFER_BIT); 
 
//例子所有新内容都在一下4句,你可以试试取消反走样的语句(1、4) 
//则可以很清楚的比较一下反走样对图象质量的改进。 
        glEnable(GL_LINE_SMOOTH); 
        glEnable(GL_BLEND); 
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
        glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE); 
 
        glDepthFunc(GL_LESS); 
        glEnable(GL_DEPTH_TEST); 
        glShadeModel(GL_FLAT); 
} 
 
void CALLBACK reshape(GLsizei w,GLsizei h) 
{ 
 
glViewport(0,0,w,h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
 
if(w<=h) 
 glOrtho(-5.0,5.0,-5.0*(GLfloat)h/(GLfloat)w, 
         5.0*(GLfloat)h/(GLfloat)w,-5.0,5.0); 
else 
  glOrtho(-5.0*(GLfloat)h/(GLfloat)w, 
         5.0*(GLfloat)h/(GLfloat)w,-5.0,5.0,-5.0,5.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
} 
 
 
void CALLBACK display(void) 
{ 
 
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
 
  glLineWidth(5.0); 
  glColor4f(1.0,1.0,0.0,0.7); 
  glPushMatrix(); 
  glRotatef(45.0,1.0,1.0,0.0); 
  auxWireOctahedron(2.0); 
  glPopMatrix(); 
  glFlush(); 
 
 
} 
void main(void) 
{ 
    myinit(); 
     
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 
} 
//end of sample 
/////////////////////////////////////////////////////////////////// 
 
再给出一个多边形反走样的例子 
/////////////////////////////////////////////////////////////////// 
//sample.cpp 
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA

void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
 
 
void myinit(void) 
{ 
 
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        auxInitPosition(0,0,500,500); 
        auxInitWindow("sample1"); 
        glClearColor(0.0,0.0,0.0,0.0); 
        glClear(GL_COLOR_BUFFER_BIT); 
 
        GLfloat mat_ambient[]={0.5,0.5,0.0,1.0}; 
        GLfloat mat_diffuse[]={1.0,0.8,0.1,1.0}; 
        GLfloat position[]={1.0,0.0,1.0,0.0}; 
 
        glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient); 
        glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse); 
        glLightfv(GL_LIGHT0,GL_POSITION,position); 
 
        glEnable(GL_LIGHTING); 
        glEnable(GL_LIGHT0); 
        glCullFace(GL_BACK); 
        glEnable(GL_CULL_FACE); 
//启用多边形反走样 
        glEnable(GL_POLYGON_SMOOTH); 
         
        glEnable(GL_BLEND); 
        glBlendFunc(GL_SRC_ALPHA,GL_ONE); 
 
        glDepthFunc(GL_LESS); 
        glEnable(GL_DEPTH_TEST); 
        glShadeModel(GL_FLAT); 
} 
 
void CALLBACK reshape(GLsizei w,GLsizei h) 
{ 
glViewport(0,0,w,h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
 
if(w<=h) 
 glOrtho(-5.0,5.0,-5.0*(GLfloat)h/(GLfloat)w, 
         5.0*(GLfloat)h/(GLfloat)w,-5.0,5.0); 
else 
  glOrtho(-5.0*(GLfloat)h/(GLfloat)w, 
         5.0*(GLfloat)h/(GLfloat)w,-5.0,5.0,-5.0,5.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
} 
 
 
void CALLBACK display(void) 
{ 
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
 
  glLineWidth(5.0); 
  glColor4f(1.0,1.0,0.0,0.7); 
  glPushMatrix(); 
  glRotatef(45.0,1.0,1.0,0.0); 
  auxSolidIcosahedron(2.0); 
  glPopMatrix(); 
  glFlush(); 
} 
void main(void) 
{ 
    myinit(); 
     
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 
} 
//end of sample 
//////////////////////////////////////////////////////////////////// 
比较采用反走样后的结果,可以明显看出多变形直线边界出锯齿得到了平滑。 
 
3 雾化 
最后来介绍雾化,雾化不但可以使景物更加真实,而且大大减少计算量,开过 
F22的玩家不会忘记雾化的远近直接影响游戏的速度吧。一般的雾化模型是考虑 
把物体实际颜色和雾化颜色向融合。具体雾化的浓淡有定义的数学模型来决定 
包括线性变化、指数变化和指数平方变化等。定义雾化也很简单,只要遵循下面 
步骤: 
一 启用雾化 glEnable(GL_FOG); 
二 控制雾化 glFog*() 
void glFog{if}[v](GLenum,TYPE param); 
 
当GLenum是GL_FOG MODE时,param可以是GL_EXP(指数) 
                                    GL_EXP2(指数平方) 
                                    GL_LINEAR(线性) 
 
当GLenum是GL_FOG_DENSITY GL_FOG_START GL_FOG_END时,param分别指定不同 
雾化数学模型下不同计算公式的参量,具体可以参阅连机手册。 
 
当GLenum时GL_FOG_COLOR时,param是指向颜色向量的指针 
三 必要时可以用glHint(GL_FOG_HINT,XX)指定雾化效果 
下面给出例子: 
/////////////////////////////////////////////////////////////////// 
//sample.cpp 
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>

#pragma comment(lib, "OpenGl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")

#pragma warning(disable : 4244)		// MIPS
#pragma warning(disable : 4136)		// X86
#pragma warning(disable : 4051)		// ALPHA

void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
 
 
void myinit(void) 
{ 
 
        auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        auxInitPosition(0,0,500,500); 
        auxInitWindow("sample1"); 
        glClearColor(0.0,0.0,0.0,0.0); 
        glClear(GL_COLOR_BUFFER_BIT); 
 
        GLfloat mat_ambient[]={0.0,0.1,0.8,1.0}; 
        GLfloat mat_diffuse[]={0.0,0.3,0.6,1.0}; 
        GLfloat mat_specular[]={1.0,0.0,1.0,1.0}; 
        GLfloat mat_shininess[]={15.0}; 
        GLfloat position[]={5.0,5.0,5.0,0.0}; 
        GLfloat fogColor[4]={0.6,0.6,0.0,1.0}; 
 
        glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient); 
        glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse); 
        glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); 
        glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); 
        glLightfv(GL_LIGHT0,GL_POSITION,position); 
 
        glEnable(GL_LIGHTING); 
        glEnable(GL_LIGHT0); 
        glFrontFace(GL_CW); 
//    glEnable(GL_POLYGON_SMOOTH); 
//      glEnable(GL_BLEND); 
//      glBlendFunc(GL_SRC_ALPHA,GL_ONE); 
 
        glDepthFunc(GL_LESS); 
        glEnable(GL_DEPTH_TEST); 
 
//启用雾化处理     
        glEnable(GL_FOG); 
        { 
                //采用线性变化的雾化效果 
                glFogi(GL_FOG_MODE,GL_LINEAR); 
                //指定雾化颜色(黄色) 
                glFogfv(GL_FOG_COLOR,fogColor); 
                //指定按线性变化时计算公式的参量 
                glFogf(GL_FOG_START,3.0); 
                glFogf(GL_FOG_END,15.0); 
                //规定雾化效果的质量 
                glHint(GL_FOG_HINT,GL_DONT_CARE); 
        } 
//      glShadeModel(GL_FLAT); 
} 
 
void CALLBACK reshape(GLsizei w,GLsizei h) 
{ 
 
glViewport(0,0,w,h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
 
if(w<=h*3) 
 glOrtho(-6.0,6.0,-2.0*(GLfloat)h*3/(GLfloat)w, 
         2.0*(GLfloat)h*3/(GLfloat)w,0.0,10.0); 
else 
  glOrtho(-6.0*(GLfloat)h/(GLfloat)w, 
         6.0*(GLfloat)h/(GLfloat)w,-2.0,2.0,0.0,10.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
} 
 
 
void CALLBACK display(void) 
{ 
 
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
 
//在不同远近(Z方向)绘制同样大小、颜色的环,显示雾化的效果 
  glPushMatrix(); 
  glTranslatef(-3.0,-1.5,-3.0); 
  auxSolidTorus(0.6,1.5); 
  glPopMatrix(); 
   
  glPushMatrix(); 
  glTranslatef(-0.5,-0.5,-6.0); 
  auxSolidTorus(0.6,1.5); 
  glPopMatrix(); 
 
  glPushMatrix(); 
  glTranslatef(2.0,0.5,-8.0); 
  auxSolidTorus(0.6,1.5); 
  glPopMatrix(); 
   
  glFlush(); 
 
 
} 
void main(void) 
{ 
    myinit(); 
     
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 
} 
//end of sample 
////////////////////////////////////////////////////////////////////

分享到:
评论

相关推荐

    OpenGL基础图形编程

     第十四章 OpenGL特殊光处理  14.1 光照模型  14.1.1 全局环境光  14.1.2 近视点与无穷远视点  14.1.3 双面光照  14.2 光源位置与衰减  14.3 聚光与多光源  14.3.1 聚光  14.3.2 多光源与例程  14.4 光源...

    OpenGL超级宝典源码

    第二部分“OpenGL渲染组成”深入阐述了0penGL的使用、高级特性及特殊效果,如处理光栅图形、纹理贴图、3D建模和物体合成、混色和雾化效果,处理三角形、曲线和曲面、交互式图形,另外还介绍了如何利用OpenGL制作图像...

    OpenGL_参考手册.rar

    近年来,随着计算机技术的进步,我们跨入了一个三维时代,各种扣人心弦的三维游戏、能数字化地显示天气变化的气象服务、震撼人心的3D数字化特殊效果,无不使我们体验到三维世界的全新感觉。可视化、计算机动画、...

    OpenGL游戏程序设计

    第7 章 特殊的平面_树_____栽些树种些草,让这个OpenGL世界充满生机。 第8 章 显示3D模型________在OpenGL场景中显示3DS格式的模型。 第9 章 使用MD2动画模型___OpenGL场景中出现了活生生的人(3D动画模型)。 第10 章...

    OpenGL超级宝典.rar

    第二部分“OpenGL渲染组成”深入阐述了0penGL的使用、高级特性及特殊效果,如处理光栅图形、纹理贴图、3D建模和物体合成、混色和雾化效果,处理三角形、曲线和曲面、交互式图形,另外还介绍了如何利用OpenGL制作图像...

    [openGL超级宝典(第四版)

    第二部分“OpenGL渲染组成”深入阐述了OpenGL的使用、高级特性及特殊效果,如处理光栅图形、纹理贴图、3D建模和物体合成、混色和雾化效果,处理三角形、曲线和曲面、交互式图形,另外还介绍了如何利用OpenGL制作图像...

    学OpenGL编3D游戏

    第7 章 特殊的平面_树_____栽些树种些草,让这个OpenGL世界充满生机。 第8 章 显示3D模型________在OpenGL场景中显示3DS格式的模型。 第9 章 使用MD2动画模型___OpenGL场景中出现了活生生的人(3D动画模型)。 第10 章...

    元旦倒计时代码. 使用 OpenGL 在 3D 环境中绘制炫酷的数字,并使用一些特殊的着色器效果来使它们看起来更动起来 这是一个

    使用 OpenGL 在 3D 环境中绘制炫酷的数字,并使用一些特殊的着色器效果来使它们看起来更动起来。这是一个使用 C++ 和 ...您可以修改着色器代码和顶点数据来控制数字的外观,并添加一些特殊效果来使它看起来更炫酷。

    OpenGL超级宝典.(第4版)+源码

    然后,深入研究使用OpenGL和它的一些高级特性及不同的特殊效果。第二部分包括第15章到第18章,分别介绍了OpenGL中支持可编程硬件[特别是在OpenGL着色语言(GLSL)中]的新特性。第三部分是第19章到第22章,着重介绍...

    OpenGL编3D游戏实例源代码

    C、程序运行效果 D、源程序 光盘目录结构 学OpenGL编3D游戏DEMO版目录下内容说明 目录 A01_OpenGL的程序框架 第1 章源程序 A02_OpenGL的基本图形 第2 章源程序 A03_OpenGL的组合图形 第3 章源程序 A04_摄像...

    OpenGL超级宝典中文第四版(带书签) part1/2

    然后,深入研究使用OpenGL和它的一些高级特性及不同的特殊效果。第二部分包括第15章到第18章,分别介绍了OpenGL中支持可编程硬件[特别是在OpenGL着色语言(GLSL)中]的新特性。第三部分是第19章到第22章,着重介绍...

    OPenGL支持库2.0#0版(静态版)

    可以进行OPenGL的坐标变换、建模、测试运算、缓存、效果、纹理、显示列表、光栅、文字、特殊模型、载入三维模型文件、交互操作的操作。易语言OPenGL_static.lib支持库为易语言静态支持库,需要易语言系统5.0版本的...

    OpenGL三维图形程序设计

    体建模、特殊光和特殊效果处理以及OpenGL显示列表、帧缓存与动画的程序设计技巧。 书中列举了大量的编程实例,并且全部存于本书附盘中。所有例程都经过调试通过,是 OpenGL开发者必备之参考。 本书无论是对初次...

    OpenGL编程轻松入门

    OpenGL编程轻松入门之使用颜色 ...OpenGL编程轻松入门之特殊效果操作 OpenGL编程轻松入门之曲面和曲线 OpenGL编程轻松入门之NURBS曲线和曲面 OpenGL编程轻松入门之二次几何体 OpenGL编程轻松入门之动画制作

    openGL超级宝典(第四版).

    然后,深入研究使用OpenGL和它的一些高级特性及不同的特殊效果。第二部分包括第15章到第18章,分别介绍了OpenGL中支持可编程硬件[特别是在OpenGL着色语言(GLSL)中]的新特性。第三部分是第19章到第22章,着重介绍...

    OpenGL超级宝典(中文第二版)pdf版 part1 of 2

    第二部分“OpenGL渲染组成”深入参数了OpenGL的使用、高级特性及特殊效果,如处理光栅图形、纹理贴图、3D建模和物体合成、混色和雾化效果、处理三角形、曲线和曲面、交互式图形,另外还介绍了如何利用OpenGL制作...

Global site tag (gtag.js) - Google Analytics