随笔 - 505  文章 - 1034  trackbacks - 0
<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234


子曾经曰过:编程无他,唯手熟尔!

常用链接

留言簿(94)

随笔分类(649)

随笔档案(505)

相册

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

积分与排名

  • 积分 - 893949
  • 排名 - 14

最新随笔

最新评论

阅读排行榜

评论排行榜

简介:
This sample uses the GPU to render post-processing effects with source images and video. It takes advantage of the nv_image_processing framework, Cg, and GLSL for to implement several video filters, including guassian blur, edge detection overlay, wobble, TV-noise, radial blur, and night vision.


这个例子用GPU渲染对图片或视频进行后处理得到的效果。它利用nv_image_processing框架,Cg还有GLSL实现了几种视频过滤器,包括高斯模糊,edge detection overlay, wobble, TV-noise, radial blur, and night vision.

截图:


编译:
        VC7.1编译的,但是我机器上没装,只有VC8.0,所以要把其用到的lib也都用VC8重新生成一下(期间会遇到n个编译不过的地方)。
        lib的solution目录NVIDIA Corporation\SDK 9.5\LIBS\
        这些lib里面最麻烦的是这个OpenEXR-1.2.1-win32,要自己下载源码来生成对应的lib.

        最搞的是这个地方,nErrorCode总是1282(0x502),害得程序执行不起来,我重新安装了驱动也不好使,最后我加了句return直接返回,程序就执行起来了
void gl_assert(const char * zFile, unsigned int nLine)
{
    
return// lyl: 直接返回了
    GLenum nErrorCode = glGetError();

    
if (nErrorCode != GL_NO_ERROR)
    {
        
const GLubyte * zErrorString = gluErrorString(nErrorCode);
        std::cerr 
<< "Assertion failed (" <<zFile << ":"
                  
<< nLine << "" << zErrorString << std::endl;

        exit(
-1);
    }
}

      dshow用的是dxsdk_feb2005_extras.exe里面的,怎一个“烦”字了得啊!
代码注解:
      渲染核心代码如下
Scene::render()
{
    
double time;

    
if (_bUseGLSL) {
        time 
= renderGLSL();
    } 
    
else
    {
        
if (!_bUseNVImage) 
        {
            time 
= renderCg();
        } 
        
else
        {
            time 
= renderNVImageProc();
        }
    }
    
return time;
}
没看到opengl的API不算看到核心,进一个里面看看
Scene::renderGLSL()
{
    assert(_pImageSource 
!= 0);
    unsigned 
int nDownloadedBytes = _pImageSource->pushNewFrame();

    
float nX = 0.0f, nY = 0.0f;

    
float nImageWidth  = static_cast<float>(_pImageSource->image().width());
    
float nImageHeight = static_cast<float>(_pImageSource->image().height());

    
if (nImageWidth < MIN_WIDTH) {
        nX 
= (_nWindowWidth - nImageWidth) / 2;
    }
    
if (nImageHeight < (_nWindowHeight - _pApplicationInfo->height())) {
        nY 
= (_nWindowHeight - _pApplicationInfo->height() - nImageHeight) / 2;
    }

    
double timer = 0.0;

    glClear(GL_COLOR_BUFFER_BIT);

    glViewport(
00, (GLsizei) _nWindowWidth, (GLsizei) _nWindowHeight - _pApplicationInfo->height());
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluOrtho2D(
0, _nWindowWidth, 0,  _nWindowHeight - _pApplicationInfo->height());

    assert(_pProgramGLSL 
!= 0);
    _pProgramGLSL
->setWindowSize(_nWindowWidth, _nWindowHeight);
    _pProgramGLSL
->setTextureSize( (int)nImageWidth, (int)nImageHeight, 0 );

    _pProgramGLSL
->bind();  // bind our vertex/pixel shader program

    
if (_pInteractionController)
        _pInteractionController
->updateUniforms();

    
// draw the image as a textured quad
    glEnable (GL_FRAGMENT_PROGRAM_NV);
    glEnable (GL_TEXTURE_RECTANGLE_NV);

    
// draw the image as a textured quad
    glBegin (GL_QUADS);
        glTexCoord2f (
0.00.0);                    glVertex2f(nX,             (_bInvertTexCoords ? nImageHeight : 0.0+ nY);
        glTexCoord2f (nImageWidth, 
0.0);            glVertex2f(nImageWidth+nX, (_bInvertTexCoords ? nImageHeight : 0.0+ nY);
        glTexCoord2f (nImageWidth, nImageHeight);   glVertex2f(nImageWidth
+nX, (_bInvertTexCoords ? 0.0 : nImageHeight) + nY);
        glTexCoord2f (
0.0, nImageHeight);           glVertex2f(nX,             (_bInvertTexCoords ? 0.0 : nImageHeight) + nY);
    glEnd ();

    glDisable (GL_TEXTURE_RECTANGLE_NV);
    glDisable (GL_FRAGMENT_PROGRAM_NV);

    _pProgramGLSL
->unbind();

    assert(_pApplicationInfo 
!= 0);
    _pApplicationInfo
->setBytesDownloaded(nDownloadedBytes);

    
// draw the GUI elements
    glViewport(0, _nWindowHeight - _pApplicationInfo->height(), _nWindowWidth,  _pApplicationInfo->height());
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluOrtho2D(
0, _nWindowWidth, 0, _pApplicationInfo->height());
    _pApplicationInfo
->render(00);

    
// Now render the slider bars
    glViewport(00, _nWindowWidth, _nWindowHeight);
    
if (_pInteractionController)
        _pInteractionController
->renderSliders(_pApplicationInfo->width(), 0);

    glutSwapBuffers();

    assert(_pImageSink 
!= 0);
                                
// readback 
    unsigned int nReadBytes = _pImageSink->pull(00);
                                
// number of bytes read back will be displayed 
                                
// in successive frame
    _pApplicationInfo->setBytesRead(nReadBytes);

    
return timer;
}
3D部分的主体架构可以参照这儿看看就明白了
        NVIDIA SDK 9.5 Simple Texture Rectangle
原理一样,都是往一个面上贴了个texture。
                   上面这个的texture是静态的,从硬盘上的图片生成的;
                    本篇里面是动态的,一帧一帧的视频或者图片进行下后处理然后放到texture里面。

2009-1-9

Video Filter

posted on 2008-12-23 01:45 七星重剑 阅读(1307) 评论(0)  编辑 收藏 引用 所属分类: Game GraphicsIDE -- visual c++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理