滴水穿石

宁静致远

C++博客 首页 新随笔 联系 聚合 管理
  3 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks

2009年7月15日 #

1、 glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei作用
      在OpenGL初始化完成之后,我们应该进行一些视图设置。首先是设定视见区域,即告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位。当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口。我们调用glViewPort函数来决定视见区域:

    procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);

    其中,参数XY指定了视见区域的左下角在窗口中的位置,一般情况下为(00),WidthHeight指定了视见区域的宽度和高度。注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。图3.1-1表示了在WindowsGDI中的窗口坐标,而图3.1-2则是OpenGL所定义的窗口坐标。
2、  OpenGL编程的glOrtho()函数使用

正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体,如图所示。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。

    glOrtho就是一个正射投影函数。它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(leftbottom-near),右上角点是(righttop-near);远裁剪平面也是一个矩形,左下角点空间坐标是(leftbottom-far),右上角点是(righttop-far)。所有的nearfar值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时farnear都为负值,物体在视点后面时farnear都为正值。
3、  void glMatrixMode(GLenum mode)

1).OpenGL中用于指定变换时主要有以下4条命令:  
  glMatrixMode(GLenum   mode);  
      ---用于指定用哪1个矩阵作为当前矩阵,mode用于指定哪一种矩阵栈是其后矩阵操作的目标。mode可取:  
            GL_MODELVIEW:把其后的矩阵操作施加于造型视图矩阵栈。(默认)  
            GL_PROJECTION:把其后的矩阵操作施加于投影矩阵栈。  
            GL_TEXTURE:把其后的矩阵操作施加于纹理矩阵栈。   
    
 2)glLoadIdentity();  
      ---将当前矩阵赋值为单位矩阵。  
  glLoadMatrix(const   TYPE   *m);  
      ---将矩阵m赋值给当前矩阵,m中包含矩阵的16个值,列优先组成4*4矩阵。  
  glMultiMatrix(const   TYPE   *m);  
      ---将m乘于当前矩阵。   

    在进行造型和视图变换之前,必须调用:  
      glMatrixMode(GL_MODELVIEW);  
  在发出投影变换命令之前,需要调用:  
      glMatrixMode(GL_PROJECTION);glLoadIdentity();   
 3).glPushMatrix();---把当前矩阵保存在栈顶上;  
      glPopMatrix();----弹出栈顶上的矩阵,恢复原来的矩阵。  
  用push和pop的目的是为了保护原来的矩阵在一系列变换操作后被破坏,  
  这和汇编中保护寄存器的原理一样,push后当前矩阵没有变化,但是一般在push之后都调用glLoadIdentity();将当前矩阵赋值为单位矩阵,然后再操作的  

4、glLoadIdentity():该函数的功能是重置当前指定的矩阵为单位矩阵。

glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模弄视图矩阵储存了有关物体的信。

posted @ 2009-07-15 17:10 点滴 阅读(520) | 评论 (0)编辑 收藏

2009年6月30日 #

        ffmpeg.c是在Linux下编写用vc的编译器调试通过的,有很多代码规则和vc的编译器不一样,有些库vc下没有。
       由于VC++并非是一个标准的C编译器,所以ffmpeg使用的C99以及at&t汇编语法在VC下无法编译通过,我曾经从ffmpeg中提取过h263++的编码器,在不使用mmx优化选项的情况下,对C代码进行少许的改动还是能够编译通过和正常使用的,但是没有MMX优化的东西使用起来还是不爽的。
      采用MINGW在window平台下编译ffmpeg是个不错的选择,当然如果你有兴趣可以把它完全移植到VC环境下,我曾经的老板这么做过,(这是他的命根子,我连看一看的机会都没有,呵呵)据说移植了百万行代码。不过我怎么没发现有那么多呢。不过在VC下编译ffmpeg 会比用Mingw编译小很多,好像是500多K。
       下面就说说用Mingw如何编译ffmpeg 吧。

第一步:应该是安装和配置编译环境,我的做法比较简单,首先我去下载了一个DEV-CPP编译器,它包含了最新的Mingw。如果你没有DEV-CPP,你可以直接下载并安装Mingw.下载地址是http://www.mingw.org/。我安装的版本是MinGW-3.1.0-1.exe,请顺手下载一个MSYS-1.0.10.exe它是windows下的一个虚拟linux shell环境,我们需要用它来执行 configure 、make 等命令。首先安装 MinGW到一个指定的目录,假设在c:\MinGW目录下吧。然后设置环境变量,在PATH中加c:\MinGW\BIN。然后安装MSYS ,安装的过程中会提示你进行一些配置,其中需要提示你输入MinGW 的安装目录。这里需要注意一下,请输入 C:/MinGW(搞不懂,我输入C:\MinGW居然告诉我找不到,呵呵,可能是开发者玩惯LINUX了吧)如果是安装了DEV-CPP那就输入C:/dev-cpp即可。哦,差点忘了,您安装MinGW的时候别忘了下载一个WINAPI的源码包,如果安装DEV-CPP就不用了。哎,建议你还是安装个DEV-CPP吧,这个小东西还是很不错的,需要的东西基本上都有了。好了,编译环境配置好了。

第二步:下载一个最新的ffmpeg源码包,我是通过CVS下载的,具体你可以看看ffmpeg的首页http://ffmpeg.sourceforge.net/index.php,通过CVS下载至少能保证你能得到最新的代码,ffmpeg的h264更新好像挺快的,呵呵。将ffmpeg源码解压缩到一个目录里,或者check-out 到一个目录里,在来个假设吧,D:\FFMpeg,运行桌面上的MSYS快捷方式,进入MSYS shell 里(如果安装没有创建快捷方式,晕我就不罗嗦了,安装目录里找MSYS.bat)。如果如下命令:

1、$ cd /d/ffmpeg 进入ffmpeg工程目录.

2、$ ./configure --enable-shared --enable-memalign-hack --disable-debug --enable-small

3、$ make

可以了,这是编译结束了,你可以在相应的目录里找到编译好的文件。如果不加--disable-debug --enable-small目标文件可能会很大,我的7M多。我下载的ffmpeg最新版本里有一个错误,在libavcodec目录下的snow.c文件的第3460行,pict->quality= ff_rate_estimate_qscale(&s->m);错误提示参数不够,我改成pict->quality= ff_rate_estimate_qscale(&s->m,0);编译顺利通过。
posted @ 2009-06-30 16:35 点滴 阅读(1301) | 评论 (1)编辑 收藏

ffmpeg的SVN仓库更新源代码的用户,ffmpeg工程组特开辟一个专区,定期更新ffmpeg的源代码,并将其快照上传,有需要的朋友可以长期关注本帖。
ffmpeg的编译指令通常为:
1、配置:
configuration: --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-faadbin --enable-dts --enable-pp --enable-faad --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay  --prefix=/usr  --extra-cflags=-I/local/include --extra-ldflags=-L/local/lib
(注意,其中有很多选项是可选择的,如:--enable-amr_wb,是编译对3GP支持所需要的库,如果你不需要对3GP的支持,或是没有下载amr_wb的库,就不要加该选项了)
2、编译:
make
3、安装:
make install  (注意,安装通常是指将编译的库拷贝到/local/lib目录下,将所需要的头文件拷贝到/local/include目录下,如果你是通过MSYS+MinGW编译的话,假如你的MSYS是安装在d:\msys\1.0目录下,则make install之后就将生成的库文件拷贝到了d:\msys\1.0\local\lib目录下了)

其它库(如x264、xvid等)的编译指令通常为:
1、配置:
configure --prefix=/usr --enable-shared
2、编译:
make
3、安装:
make install

FFDShow源代码,2007年2月10日更新:http://www.chinavideo.org/downloads/ffdshow_src_20070210.rar (11.2MB)

ffmpeg sdk 开发手册(感谢ffmpeg工程组成员:chwyjf):http://www.bairuitech.com/html/ruanjianxiazai/index.html

有关“3GP、amrnb和amrwb编译问题。”可以参考:http://bbs.chinavideo.org/viewthread.php?tid=2469&extra=page%3D1
编译AMR所需要的UnZip工具可在:http://www.info-zip.org/UnZip.html 上面下载(为了方便大家,后面附件中有Win32的版本)
最新的AMR(NB、WB)源代码可以:http://ftp.penguin.cz/pub/users/utx/amr/ 上面下载

ffmpeg+x264最新源代码(2007-10-07):http://www.bairuitech.com/html/ruanjianxiazai/20071006/61.html

另一篇关于ffmpeg的编程指南(英文版本):http://www.dranger.com/ffmpeg/

posted @ 2009-06-30 15:17 点滴 阅读(686) | 评论 (1)编辑 收藏

仅列出标题