平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

A*算法的泛型抽象实现

     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1#ifndef __ASTAR_SERACH_ALGO_H__  2#define __ASTAR_SERACH_ALGO_H__&nbs...  阅读全文

posted @ 2005-09-17 08:59 linghuye 阅读(1565) | 评论 (1)编辑 收藏

以学习之名

以学习之名,计划购入一Nvidia Geforce 6600的显卡插在我的AGP 4X的主板上,.

毕业后累计购入大中小件
1.19寸平面CRT,刚毕业,为了在电脑上看大量原版电子书.
2.打印机,打印原版电子书若干,设计模式英文版一份.
3.扫描仪,扫描电子书和照片.
4.MP3播放器,练习我极差的英文听力,多么正义的理由
5.19寸液晶,CRT坏了,保护眼睛.
6.移动硬盘,备份我几年的劳动成果.
7.,DVD,刻录机(刻录资料),凡此种种.

工欲善其事,必先利其器,也为了平抚我大学4年和一群鸟人抢上一台破电脑过程中受伤的心灵,我通常都这么对自己解释.

福州真NND shit是个烂地方,电脑城找不到一块AGP 6600的显卡,全TM没货,那些代理怎么作生意的!
还有那些奸商们,AGP4x,8x,PCIE, 变着方地更改主板的接口.我就不屌他,坚持把我的AGP 4X, SRDM, USB 1.0用到2008年,气死他们.

posted @ 2005-09-16 11:38 linghuye 阅读(324) | 评论 (1)编辑 收藏

Opengl Occlusion Query扩展理解和使用

1.Opengl Occlusion Query可以让你计算取得所绘Primitive图元的对最终画面的实际的贡献Fragment情况.
2.使用glGenQueriesARB,glDeleteQueriesARB建立删除Query对象.
3.在图元绘制起始处加glBeginQueryARB,在图元绘制结束处加glEndQueryARB.
4.使用glGetQueryObjectuivARB,glGetQueryivARB,glGetQueryObjectivARB取得贡献Fragment信息.
5.隶属Opengl 1.5 标准.

References:
http://www.codesampler.com/oglsrc/oglsrc_7.htm#ogl_occlusion_query
http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt

posted @ 2005-09-15 18:54 linghuye 阅读(1378) | 评论 (0)编辑 收藏

Opengl Frame Buffer扩展理解和使用

FrameBuffer作为比PixelBuffer更好的解决方案被提出.

1.使用glGenFramebuffersEXT,glDeleteFramebuffersEXT建立,删除FrameBuffer对象.
2.使用glBindFramebufferEXT绑定当前使用的FrameBuffer对象.如果指定0,则表示使用默认窗口系统的Framebuffer,而若指定自建的Framebuffer对象,则随后的Opengl操作将作用在该Framebuffer上,亦即作用在被Attach到此Framebuffer的映像Image上(Image可以是Texture对象或RenderBuffer对象).但不同于Pixel Buffer,FrameBuffer使用当前的Opengl Context.
3.使用glFramebufferTexture2DEXT将一个Texture对象的Image,Attch到Framebuffer的一个ATTACHMENT槽上,如GL_COLOR_ATTACHMENT0_EXT.

4.使用glGenRenderbuffersEXT,glDeleteRenderbuffersEXT建立,删除RenderBuffer对象.
5.使用glRenderbufferStorageEXT指定RenderBuffer的格式和尺寸.
6.使用glFramebufferRenderbufferEXT将一个RenderBuffer对象的Image,Attch到FrameBuffer的一个ATTACHMENT槽上,如GL_DEPTH_ATTACHMENT_EXT.

7.掌握其本质概念,RenderBuffer和Texture是一个层次上的概念,都是作为图像数据的傀儡表达,其所包含的图像数据称为Image,而FrameBuffer是渲染操作的目标区,它需要Image来支撑,而Texture/RenderBuffer可以提供出它们的Image给FrameBuffer使用.各对象的数据格式定义必须一致,否则操作失败,使用CheckFramebufferStatusEXT检查当前的Framebuffer是否Complete.
8.Framebuffer是一个非常实用的对象,可惜我的Geforce 2还不能支持它,还有那些官僚的ARB,他们真的要毁了Opengl才甘心吗.

  glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_idFrameBuffer);
  glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_texture, 0);
  return (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT);

9.ARB版本的FrameBuffer

  The default framebuffer for rendering and readback operations is provided by the window system.


Reference:
http://download.nvidia.com/developer/presentations/2005/GDC/OpenGL_Day/OpenGL_FrameBuffer_Object.pdf
http://oss.sgi.com/projects/ogl-sample/registry/EXT/framebuffer_object.txt

posted @ 2005-09-14 00:05 linghuye 阅读(3193) | 评论 (2)编辑 收藏

程序的空想

今天google了一下mywarcraftstudio,搜索出了4000多个结果,大部分为国外论坛上的介绍,tutorial什么的,有说awesome的,有说buggy的,有骂shit的,还有人用它改本地人物的装备模型的,竟然还有做nuke patch的,而我很开心的是很多人都说have fun with it.
于是我奇怪于这样的现象,我先前做的中文版,用的人却很少,倒是由此交到几个圈内的朋友,而后也有几个外国的通过google找到我交流一些技术,于是我删掉了中文资源,只出了英文版发布到国外站点,然后它转了一圈回来了,却是翻译的英文mywarcraftstudio的使用教程.
做程序的当然希望有很多人能运行自己写的程序,并且have fun with it,但可惜的是这个程序确是我写过使用范围最广的程序,但却不是我目标中的游戏.只是一个学习研究中的副产品破解程序而已,悲乎!
只是要更加坚定地努力向着目标前进,中国的程序员承继其祖先的勤劳和聪明,不会甘于人后的.
咳,如果国内的程序也可以和国外程序一样不用为养家糊口供房子而奔波,他们会更有作为的.

posted @ 2005-09-13 00:53 linghuye 阅读(598) | 评论 (2)编辑 收藏

Opengl中播放Divx格式的AVI

1.基本思路: 解码取得Divx avi影像的每一帧图像数据,加载到纹理或Pixel Buffer上,而后作为纹理单元渲染出来.
2.Divx解码格式是开源的,拥有大量基于linux下的各播放器所携带的程序库,最优秀的是FFmpeg开源项目携带的libavcodec.
3.魔兽世界使用DivxDecoder.dll播放divx片头动画,估计也是使用libavcodec..
4.该死的垃圾sscanf函数,永远不要用这个函数.

1.从http://www.mingw.org/的download页面,选择current大类里的Mingw,MSYS的exe安装版本,下载.
2.先安装Mingw,在安装过程中它还会下载大约50M的程序包到安装程序所在的目录,一并安装,接着安装MSYS,安装后它会询问Mingw的安装位置,不用理他,直接修改\etc\fstab.sample文件里的c:\mingw为实际的安装目录.
3.Mingw是开发程序包,MSYS是模拟linux下的运行编译环境.
3.从http://ffmpeg.sourceforge.net/index.php下载FFmpeg的源代码包,推荐CVS,解压到MSYS的\home\your username\下.
4.启动msys.bat,进入后起始位置在\home\youruser name,使用cd命令进入ffmpeg目录,键入下列指令:
  ./configure --enable-shared --enable-memalign-hack
  make
5.编译后FFmpeg生成整个工程的执行文件,取其中的avcodec.dll,avcodec.lib,avformat.dll,avformat.lib,加上源代码中的.h,就是一个SDK了.

其时很讨厌linux项目的结构,繁琐,

使用opengl播放示例代码
http://www.cnitblog.com/Files/linghuye/TestAVIEx.rar

References: http://ffmpeg.sourceforge.net/index.php
http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html
http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/24601

posted @ 2005-09-11 10:03 linghuye 阅读(1468) | 评论 (3)编辑 收藏

大型程序内存分配管理和STL中的内存分配

1.对于大型游戏程序,游戏引擎,内存耗费若不加留意很快就会升到几百兆以上.

2.vector的浪费: 实际存储28000个有效元素,但在2倍增长的定律下分配了40965个元素空间,造成12965个结构内存荒废,对此必须想尽办法使用reserve.

3.不要让程序的1k内存逃出逻辑的控制,否则它会继续造成几百兆的浪费.

posted @ 2005-09-08 22:31 linghuye 阅读(553) | 评论 (0)编辑 收藏

CVS安装使用简记

1.到WinCVS网站下载WinCVS安装包(默认包含有CVSNT服务端),安装全部(客户端需要安装CVSNT中的Command Line Tool!!!).
2.使用CVSNT Control Panel的Repository Configuration添加一个主仓库,如MyCVS.
3.使用WinCVS的Admin->Login,CVSRoot<:pserver:Administrator@localhost:/MyCVS>登陆,Administrator是用户名,随后WinCVS索要密码时输入对应的Windows用户密码.
4.阅读http://www.chedong.com/tech/cvs_card.html,理解CVS版本管理的概念,根据命令行找到相应的GUI进行操作.
5.www.thathost.com/wincvs-howto/基本操作.
6.WinCVS中文版有收集详细的文档,以备有问题时深入查询学习.
7.Import Module建立项目,Checkout Module导出项目,Update更新本地为CVS的新版本,Commit更新CVS为本地的新版本.
8.用WinCVS的Preference设置Shell环境,指向python23.dll/tcl84.dll即可.

By the way,又认识了一个优秀的开源工程: Berkeley DB,本地内嵌式数据库系统.

posted @ 2005-09-08 18:44 linghuye 阅读(453) | 评论 (0)编辑 收藏

Opengl PBuffer及RenderToTexture理解和使用

1.在一个Opengl Context(HGLRC)里创建的Texture不能在另一个Opengl Context中使用.

2.HPBUFFERARB PBuffer对象提供了一种Offsceen Render Target机制,类似于GDI的内存位图,DX的RenderSurface.属Opengl 1.3规范,wgl扩展形式.

2.创建PBuffer:
  a.使用wglChoosePixelFormatARB获得指定属性特点的象素格式列表,随便选择1个,使用wglCreatePbufferARB创建一个OBuffer对象,取得该PBuffer的关联DC,创建一个Opengl Context,即PBuffer所关联的环境.
  b.进入该PBuffer的Opengl context,作图.
 
3.使用wglBindTexImageARB将1个PBuffer关联到当前的纹理对象上,此后若渲染该纹理时将渲染PBuffer表面的数据,此时纹理对象仅是个傀儡,其关联的PBuffer才是真正的数据源.wglBindTexImageARB应该在PBuffer Context之外的Opengl context中调用.

4.使用wglReleaseTexImageARB把PBuffer从其之前关联的Texture对象上释放.在PBuffer被绑定到某Texture后,未释放之前,不得进入PBuffer的Context进行渲染.显然wglReleaseTexImageARB也应该在PBuffer Context之外的Opengl context中调用

5.Render to texture 仅是PBuffer的一种使用方式. 技巧:
   a.使用glReadPixels读出PBuffer数据,然后在外部Context进行glDrawPixels,或glTexImageData,或直接图像输出,不会有Window Overlayclip 的限制. 

6.使用glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE),使得渲染出的纹理数据自动构造为Mipmap.

7.Designed for offscreen rendering - similar to windows, but non-visible!  It is a Windows system specific extentsion!

8.Problems:(From GDC Nvida)
• Each pbuffer usually has its own OpenGL context context
– (Assuming they have different pixel formats)
– Can share texture objects, display lists between pbuffers using wglShareLists ()
– Painful to manage, causes lots of bugs
• Switching between pbuffers is expensive
– wglMakeCurrent causes context switch
• Each  pbuffer has its own depth, stencil, aux buffers
– Cannot share depth buffers between pbuffers

9.Nvidia Sample http://download.developer.nvidia.com/developer/SDK/Individual_Samples/samples.html

#ifndef __OGL_RENDER_TEXTURE_H__
#define __OGL_RENDER_TEXTURE_H__

struct OglRenderTexture
{    
public:
    
enum { MAX_ATTRIBS = 256, MAX_PFORMATS = 256 }

public:
    HDC m_hWinDC;
    HDC m_hBufDC;
    HGLRC m_hWinGLRC;
    HGLRC m_hBufGLRC;
    HPBUFFERARB m_hpBuffer;
        
public:
    OglRenderTexture()
    
{
        m_hWinDC 
= NULL;
        m_hBufDC 
= NULL;
        m_hWinGLRC 
= NULL;
        m_hBufGLRC 
= NULL;
        m_hpBuffer 
= NULL;
    }

    
    
bool Create(int nWidth, int nHeight)
    
{    
        
// Record current context
        m_hWinDC = wglGetCurrentDC();
        m_hWinGLRC 
= wglGetCurrentContext();
        
if(!m_hWinGLRC) return false;
        
        
// Query for a suitable pixel format based on the specified mode.
        int     iAttributes[2*MAX_ATTRIBS];
        
float   fAttributes[2*MAX_ATTRIBS];
        memset(iAttributes, 
0sizeof(int)*2*MAX_ATTRIBS);
        memset(fAttributes, 
0sizeof(float)*2*MAX_ATTRIBS);
        
        
int nIndex = 0;
        iAttributes[nIndex
++= WGL_DRAW_TO_PBUFFER_ARB;
        iAttributes[nIndex
++= GL_TRUE;
        iAttributes[nIndex
++= WGL_BIND_TO_TEXTURE_RGBA_ARB;
        iAttributes[nIndex
++= GL_TRUE;
            
        unsigned 
int nFormats;  
        
int pFormats[MAX_PFORMATS];
        glext::wglChoosePixelFormatARB(m_hWinDC, iAttributes, fAttributes, MAX_PFORMATS, pFormats, 
&nFormats);
        CHECKF(nFormats);
        
        
// Choose the first one format
        int format = pFormats[0];
        
        
// Set up the pbuffer attributes
        nIndex = 0;
        memset(iAttributes, 
0sizeof(int)*2*MAX_ATTRIBS);
        iAttributes[nIndex
++= WGL_TEXTURE_FORMAT_ARB;
        iAttributes[nIndex
++= WGL_TEXTURE_RGBA_ARB;
        iAttributes[nIndex
++= WGL_TEXTURE_TARGET_ARB;
        iAttributes[nIndex
++= WGL_TEXTURE_2D_ARB;
        iAttributes[nIndex
++= WGL_MIPMAP_TEXTURE_ARB;
        iAttributes[nIndex
++= TRUE;
        iAttributes[nIndex
++= WGL_PBUFFER_LARGEST_ARB;
        iAttributes[nIndex
++= FALSE;
                    
        
// Create the p-buffer.
        m_hpBuffer = glext::wglCreatePbufferARB(m_hWinDC, format, nWidth, nHeight, iAttributes);
        
        
if(m_hpBuffer)
        
{    
            
// Create pbuffer context
            m_hBufDC = glext::wglGetPbufferDCARB(m_hpBuffer);
            m_hBufGLRC 
= wglCreateContext(m_hBufDC);

            glext::wglQueryPbufferARB(m_hpBuffer, WGL_PBUFFER_WIDTH_ARB, 
&nWidth);
            glext::wglQueryPbufferARB(m_hpBuffer, WGL_PBUFFER_HEIGHT_ARB, 
&nHeight);
            
            
// 仅使用 2D 模式
            wglMakeCurrent(m_hBufDC, m_hBufGLRC);
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(
0, nWidth, 0, nHeight, -11);
            glMatrixMode(GL_MODELVIEW);
            glEnable(GL_TEXTURE_2D);
            wglMakeCurrent(m_hWinDC, m_hWinGLRC);

            
return true;
        }

        
else return false;
    }

    
    
void Destroy()
    
{    
        
if(m_hpBuffer)
        
{    
            
// Clean up all resource
            wglDeleteContext(m_hBufGLRC);
            glext::wglReleasePbufferDCARB(m_hpBuffer, m_hBufDC);
            glext::wglDestroyPbufferARB(m_hpBuffer);
            m_hBufDC 
= NULL;
            m_hBufGLRC 
= NULL;
            m_hpBuffer 
= NULL;
        }

        
        m_hWinDC 
= NULL;
        m_hWinGLRC 
= NULL;
    }

    
    
bool BeginRender(GLuint texture)
    
{    
        
if(m_hpBuffer  &&  m_hBufDC  &&  m_hBufGLRC)
        
{    
            
// Record current context
            m_hWinDC = wglGetCurrentDC();
            m_hWinGLRC 
= wglGetCurrentContext();
                
            
// Ensure this texture will be bound in EndRender!
            glBindTexture(GL_TEXTURE_2D, texture);
            glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
            
            
// Release the pbuffer from the texture before render to it again!
            glext::wglReleaseTexImageARB(m_hpBuffer, WGL_FRONT_LEFT_ARB); 
            
            
// Switch to pbuffer context
            wglMakeCurrent(m_hBufDC, m_hBufGLRC);
            glClear(GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT);
            glLoadIdentity();
            
return true;
        }

        
else return false;
    }

    
    
void EndRender()
    
{    
        
// Switch to original main window render context
        wglMakeCurrent(m_hWinDC, m_hWinGLRC);
        
        
// Bind to texture
        glext::wglBindTexImageARB(m_hpBuffer, WGL_FRONT_LEFT_ARB);
    }


    
void RectangleTexture(GLuint texture, int left, int bottom, int width, int height)
    
{    
        glBindTexture(GL_TEXTURE_2D, texture);
        glBegin(GL_TRIANGLE_FAN);    
        glTexCoord2f(
0.0f0.0f);    glVertex2i(left, bottom);
        glTexCoord2f(
1.0f0.0f);    glVertex2i(left + width, bottom);
        glTexCoord2f(
1.0f1.0f);    glVertex2i(left + width, bottom + height);
        glTexCoord2f(
0.0f1.0f);    glVertex2i(left, bottom + height);
        glEnd();
    }

}
;

#endif//__OGL_RENDER_TEXTURE_H__

posted @ 2005-09-08 01:33 linghuye 阅读(5006) | 评论 (1)编辑 收藏

Unreal 2 引擎学习笔记.2700

1.需要安装Microsoft Visual C++ 6.0 + Service Pack 5 + Processor Pack编译,需要安装OpenAL以运行,否则使用-NOSOUND参数启动各主要程序.

2.主运行目录在Unreal\System下

3.使用开源工程http://www.vorbis.com

4.Core.dll模块之全局变量于Core.h以C Extern方式声明,而定义于Core.cpp,有注释.

5.app前缀的源码内容于Core模块,

6.默认为Unicode编译,but why trouble Unicode?

7.TCHAR_CALL_OS,TCHAR_TO_ANSI定义于Core\Inc\UnGCNEmu.h

8.初始化函数appInit,从属Core模块,负责初始化程序应用环境,包括
    本地文件系统(由接口FFileManager表达,定义于Core.h)
    初始化用于哈希计算的表数据缓冲
    Log系统(由接口FOutputDevice表达,定义于Core.h)
    Error报告系统(由接口FOutputDeviceError表达,定义于Core.h)
    Warning系统(由接口FFeedbackContext表达,定义于Core.h)
    内存分配系统(由接口FMalloc表达)
    名字系统(由FName类的各静态函数表达,定义与UnName.h)
    操作系统相关初始化,函数appPlatformPreInit,收集操作系统信息,并Log输出.appPlatInit创建USystem根对象,输出物理内存,CPU等的参数.
    配置文件系统(由接口FConfigCache表达,定义于Core.h)
    UObject::StaticInit(),脚本对象系统初始化.
    文件流系统(由接口FFileStream表达)
   
9.InitWindowing:窗口创建   

10.InitEngine:进入引擎初始化,先加载脚本类工厂EngineClass,然后使用这个工厂, ConstructObject相当于脚本中的new出程序脚本混合体UGameEngine对象,这个对象可以在程序或脚本中控制,因此Unreal引擎是个建立在脚本系统上的程序系统.
 UClass* EngineClass;
 EngineClass = UObject::StaticLoadClass( UGameEngine::StaticClass(), NULL, TEXT("ini:Engine.Engine.GameEngine"), NULL, LOAD_NoFail, NULL );
 UEngine* Engine = ConstructObject<UEngine>( EngineClass );
 Engine->Init();
   
11.appStrihash:字符串哈希函数,基于GCRCTable表实现.   

12.Name System:名字系统表达了Unreal对字符串资源的管理,包括程序硬编码和外部读取.由类FName负责实现.其静态变量FName::Names为所有字符串项目内存仓库表,FName::NameHash是部分需要被Hash的字符串资源.
FNameEntry的Index成员变量是到Names的索引,被Hash的字符串的hash值是到NameHash数组的索引,处理代码集中在Hardcode函数中.一个FName对象仅是包含一个到Names的索引.

13:FURL:资源目标位置表达系统.

posted @ 2005-09-05 22:16 linghuye 阅读(2729) | 评论 (2)编辑 收藏

仅列出标题
共23页: First 13 14 15 16 17 18 19 20 21 Last