Dot3 Bump Mapping和Render to texture遇到的一个问题

Bump Mapping综述

Bump Mapping凹凸纹理,是一种特效,要做成这种特效有好几种方法,我用的方法是Normal Mapping也叫做Dot3 Bump Mapping。

http://www.cnblogs.com/cxrs/archive/2009/11/22/1608086.html

 

最近在做Dot3 Bump Mapping,遇到了一个问题,在做的过程当中有用到一种Render to texture(RTT)的技术,

可以理解为把buffer中的渲染出来的东西截图当作一张图片来用,buffer渲染出来的东西可以不display出来,

但截出来的图可以贴在其它的地方。

 

遇到的问题是图片已经截出来的,并且也已经正确的贴在指定的平面上了(u,v都正确),

但贴出来的只是白白的东西,有经过alpha处理,大至的形状已经出来了,但就是没有纹理。

最后查出来的原因是在pBuffer的DC中,渲染的东西还要再重绘一遍,并且纹理也要重新读一遍,

当时就是纹理没去读而导致这错误。

 

大致说下Render to texture的基本原理和流程:

保存当前的opengl的RC和DC,创建一个Buffer,然后在Buffer的RC和DC时重绘要渲染的东西,当然纹理也要重新读,

做完其它一些操作后(截图等),还得还原之前的RC和DC。

 

注意:以前是用extgl.h来做这些事情的,现在是用wglew.h来做的,wglew要跟glew一起用

 

下面这文章已经写得非常好了

Opengl PBuffer及RenderToTexture理解和使用

http://www.cnitblog.com/linghuye/archive/2005/09/08/2557.html

 

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

两个不同opengl RC有不同的Texture

 

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

3.创建PBuffer:
     a.使用wglChoosePixelFormatARB获得指定属性特点的象素格式列表,随便选择1个,使用wglCreatePbufferARB创建一个OBuffer对象,取得该PBuffer的关联DC,创建一个Opengl Context,即PBuffer所关联的环境。

     b.进入该PBuffer的Opengl context,作图。
 
4.使用wglBindTexImageARB将1个PBuffer关联到当前的纹理对象上,此后若渲染该纹理时将渲染PBuffer表面的数据,此时纹理对象仅是个傀儡,其关联的PBuffer才是真正的数据源。wglBindTexImageARB应该在PBuffer Context之外的Opengl context中调用。

 

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

 

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值