| 赞 | 1 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2022-12-23 |
| 在线时间 | 1641 小时 |
- 梦石
- 0
- 星屑
- 66
- 在线时间
- 1641 小时
- 注册时间
- 2011-9-26
- 回帖
- 302
|
楼主 |
发表于 2013-4-24 14:43:28
|
显示全部楼层
viktor 发表于 2013-4-24 12:17 
楼主请问SinVideo.dll是怎么实现的使用DDraw往RGSSBitmap渲染?
因为在下在考虑这个问题http://bbs.66rpg ...
SinVideo 并非用 Shader 实现的,而是直接拿 RGSSBitmap 的内存区作为视频播放的缓冲区。
[pre lang="ruby" line="1"]
class ::Bitmap
# API
@@RtlMoveMemory_pl = Win32API.new('kernel32', 'RtlMoveMemory', 'pll', 'l')
@@RtlMoveMemory_lp = Win32API.new('kernel32', 'RtlMoveMemory', 'lpl', 'l')
def _dump(limit)
data = "rgba" * width * height
@@RtlMoveMemory_pl.call(data, address, data.length)
[width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # compress
end
def self._load(str)
w, h, zdata = str.unpack("LLa*")
bmp = new(w, h)
@@RtlMoveMemory_lp.call(bmp.address, Zlib::Inflate.inflate(zdata), w * h * 4)
return bmp
end
# [[[bitmap.object_id * 2 + 16] + 8] + 16] == header
def address
buffer, ad = "rgba", object_id * 2 + 16
@@RtlMoveMemory_pl.call(buffer, ad, 4)
ad = buffer.unpack("L")[0] + 8
@@RtlMoveMemory_pl.call(buffer, ad, 4)
ad = buffer.unpack("L")[0] + 16
@@RtlMoveMemory_pl.call(buffer, ad, 4)
return buffer.unpack("L")[0]
end
end[/pre]
这个是关键,先获得 Bitmap 的数据区地址,然后 DShow 解码视频- GetCurrentBuffer(&rgssBitmapAddress, NULL)
复制代码 仅此而已。
因为某些原因不能直接公布源码,不过你可以看看这个:
https://github.com/Shy07/SINRGE2/blob/develop/SINRGE2%20Core/sin_video.cpp
和 SinVideo.dll 区别仅在于把 RGSSBitmap 换成了 HTEXTURE。 |
|