【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

楼主: 鼯鼠

[转帖]D3D中的渲染到纹理

[复制链接]
 楼主| 发表于 2009-1-4 22:28:16 | 显示全部楼层

我没用过那个函数

我都是用内存直接拷贝的

 

不过我查了,这个CreateTexture 创建的内存区域是不可以锁定读写的~~所以必须要生成一个临时面作为缓冲,我试了一下,是可以的,不过效率上不敢恭维。也许还有更好的办法。上传以下执行程式,你放在SDK\Samples\C++\Direct3D\Tutorials\Tut06_Meshes  里运行,因为我就是改了这个例题代码做的,不想上传.x文件了,你的是d3dx9d_39.dll,我的好像是d3dx9d_27.dll,把你的dll文件改一下名字就行了。这个代码我做了点优化,效果还行。

 

这个执行程式运行会加载一个.x文件,中间的那个是标准的三维模型,左上角的则是那个老虎是纹理,关闭程序的时候,会自动保存这个纹理在当前文件夹里,叫做“TT.PNG”,背景是黑色的,在程序里RGB(0,0,0)作为过滤色。

ZWklHwG2.rar (18.01 KB, 下载次数: 0)

 楼主| 发表于 2009-1-6 00:42:39 | 显示全部楼层

IDirect3DSurface9   *tmp   =   NULL;  
      IDirect3DSurface9   *back   =   NULL;  
   
      //生成固定颜色模式的离屏表面(Width和   Height为屏幕或窗口的宽高)  
      D3D9Device->CreateOffscreenPlainSurface(Width,   Height,   D3DFMT_A8R8G8B8,   D3DPOOL_DEFAULT,   &tmp,   NULL);  
   
      //   获得BackBuffer的D3D   Surface  
      D3D9Device->GetBackBuffer(0,   0,   D3DBACKBUFFER_TYPE_MONO,   &back);  
   
      //   Copy一下,,需要时转换颜色格式  
      D3DXLoadSurfaceFromSurface(tmp,   NULL,   NULL,   back,   NULL,   NULL,   D3DX_FILTER_NONE,   0);   
  =================================================================================

我用这个方法生成的面,不过他的方法关键色的地方我试了 没起作用,也许是我做错了。

我还是习惯我的办法  就是在内存中锁定这个图片内存,然后去判断,如果是黑色的,就把他的A值改成0,这样就透明了。我在别的地方做类似的操作都是这么做的,所以没有用函数上写好的那个ColorKey,更主要的我觉得中间多于一个表面这样的效率不怎么高,我还是喜欢直接锁定数据修改,所以我还在尝试别的方法。

发表于 2009-1-6 20:00:26 | 显示全部楼层

我给你的连接,是关于 RTT 的,你又从中发现了啥,解决了你的疑惑??

API 我觉得。。。像DirectX这种API,肯定比我手写的代码运行快。。。。

发表于 2009-1-6 21:07:46 | 显示全部楼层

teacher米 兄弟啊,你的语言实在太精炼,我看不是很懂

但其中有一个我很感兴趣:“0x00000000 需要的打开Alpha 通道”

你的意思是说,如果想用 Clear 方法,刷出透明的背景色,除了指定 0x00000000 这个颜色以外,还需要打开 Alpha 通道???

我刚去试了一下,打开 Alpha 通道也不行啊。。

发表于 2009-1-7 16:35:39 | 显示全部楼层

我确实没有做“像素拷贝”,也没有打开 Alpha 通道,在上面几楼中我发了一个最终完成的可执行程序,里面有一个 bmp 文件叫“rtt.bmp”,你看了这个文件就明白了。。。。看了以后不要说我变态。。。。

其实这个方法,就是把透明的工作完全丢给了 DirectX。。。。。代码极其简单,只调用了几个 DirectX 的 API,其他的什么也没做。。。

 楼主| 发表于 2009-1-8 11:23:32 | 显示全部楼层

我在GUI库里增加了这个功能 哈哈~~

http://forum.exceedu.com/forum/dispbbs.asp?boardid=46&id=15780&page=1&star=1

发表于 2009-1-7 09:58:18 | 显示全部楼层
没打开Alpha 通道,也没用到像素拷贝你是怎么做到 背景透明的?
发表于 2009-1-6 09:41:00 | 显示全部楼层

我在网上找了一下,用 CreateTexture() 创建的纹理是可以使用 LOCK 和 UNLOCK 的,不过,效率我不知道如何,看代码应该效率不错

看这里:

http://blog.sina.com.cn/s/blog_54eca7b201008t3v.html

 

还有一个问题,如果解决,就再也不用担心 RTT 的背景色问题了,我这时候看我的代码,发现,每次在把“小立方体”渲染到纹理的时候,我都首先调用了

 

Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);

 

这行代码的作用是不是可以理解为:清空纹理上的内容,并且将纹理的背景色设置为黑色??更简单的说就是把整个纹理用一个黑色的刷子“全部刷黑”。。。

在这行代码之后,我才把“小立方体”渲染到纹理上,所以,纹理的背景色必然是黑色

 

那么,还有没有其他的“清空纹理”的办法,也就是“清空纹理”,但是不指定它的背景色。如果使用 Clear 方法。能不能指定“透明的颜色”作为背景色??

发表于 2009-1-6 11:13:45 | 显示全部楼层

鼹鼠~~~

完成啦~~完成啦~~~~

 

没有申请多的 Texture,没有申请多的 surface,没有 Lock 和 unLock,效率应该没问题

 

执行程序在这里,做法很简单,看看这个压缩包里的“rtt.bmp”,你就明白一切了。。。

 

wzggBPYF.rar (23.68 KB, 下载次数: 0)

发表于 2009-1-22 15:06:31 | 显示全部楼层
哦,具体是怎么做的,drucula,我看了rtt.bmp,还是不明白.
发表于 2009-1-22 15:11:32 | 显示全部楼层
你是指rtt.bmp是个透明纹理,然后在它的surface上面直接写mesh,让mesh再显示出来吗?
 楼主| 发表于 2009-1-23 03:42:17 | 显示全部楼层
这个帖子的跟踪率很高嘛~~
发表于 2009-1-23 16:38:11 | 显示全部楼层

我刚刚实验了一下,将Device->CreateTexture 改为D3DXCreateTextureFromFileEx(Device,"RTT.bmp",128,128,1,D3DUSAGE_RENDERTARGET,D3DFMT_A16R16G16B16,D3DPOOL_DEFAULT,

                                                                                                                D3DX_DEFAULT,D3DX_DEFAULT,0x00000000,NULL,NULL,&pRenderTexture);

就实现了。我觉得drucula 的方法蛮好的。

 楼主| 发表于 2009-1-23 18:05:03 | 显示全部楼层

用的是 D3DFMT_A16R16G16B16啊~~好高啊~~呵呵

我用的是A8R8G8B8的。

这个方法倒是操作很方便,也很好实现。就是要多放一张纹理~~

其实内存中可以生成一张上面这张纹理,也设置成A8R8G8B8的。用完这个内存块就毁灭,这样就OK啦~

还记得有一篇文章drucula 给的链接,我看了以后说找到原因了吗?

因为那个纹理开始我生成在里显存中,那篇文章提出了这一点,我改正了

这样放在内存中就可以读写了,用一块临时内存生成图像

无论什么方法都要支持A8R8G8B8的,如果是R5G6B6这种格式的话,无论你怎么生成,都不可能背景透明

发表于 2009-1-24 10:03:45 | 显示全部楼层
鼯鼠 ,你的方法好啊。D3DXCreateTextureFromFileEx最终还是要占那么大的显存的,还不如开始就直接在显存里创造。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 11:34

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表