在 DS 上结合 3D 和帧缓冲模式

Posted

技术标签:

【中文标题】在 DS 上结合 3D 和帧缓冲模式【英文标题】:Combining 3D and framebuffer mode on the DS 【发布时间】:2009-06-23 10:06:42 【问题描述】:

文档暗示您可以使用 3D 渲染或帧缓冲模式,并且每种模式都只能用于活动显示。有什么方法可以将 3D 渲染到一个屏幕并将帧缓冲区渲染到另一个屏幕?

【问题讨论】:

我们是在主屏幕上说 3D,在子屏幕上说帧缓冲区,还是在一个背景上讨论 3D,在另一个背景上讨论帧缓冲区?如果是后者我也想知道,因为我想用 FB 做运动模糊:) 前者对我来说已经足够了。 :) 【参考方案1】:

我听说有显示捕获功能,可以让您在子引擎(底部屏幕)上绘制 3D,所以我查了一下,发现了 example。

遗憾的是,DCAP 宏似乎没有记录在案,所以我查看了真正的定义nds/arm9/video.h

// Display capture control

#define REG_DISPCAPCNT        (*(vu32*)0x04000064)
#define REG_DISP_MMEM_FIFO  (*(vu32*)0x04000068)

#define DCAP_ENABLE    BIT(31)
#define DCAP_MODE(n)   (((n) & 3) << 29)
#define DCAP_DST(n)    (((n) & 3) << 26)
#define DCAP_SRC(n)    (((n) & 3) << 24)
#define DCAP_SIZE(n)   (((n) & 3) << 20)
#define DCAP_OFFSET(n) (((n) & 3) << 18)
#define DCAP_BANK(n)   (((n) & 3) << 16)
#define DCAP_B(n)      (((n) & 0x1F) << 8)
#define DCAP_A(n)      (((n) & 0x1F) << 0)

在我看来,您似乎可以捕捉 3D,在 sub 上绘制它,如果您愿意,可以在 main 上使用帧缓冲区。为了能够在子引擎上使用帧缓冲区,您需要使用lcdSwap() 交换屏幕。

【讨论】:

【参考方案2】:

不完全确定您的需求是什么,但在主显示引擎上使用 3D 仍然让整个子引擎执行帧缓冲(或任何其他 2D)类型的图形(例如使用扩展的旋转背景)。

如果您打算使用帧缓冲模式来捕获 3D 引擎的输出,以便您可以将 3D 渲染到两个屏幕,那么 libnds 示例文件夹中有一个示例可以执行此操作:

http://libnds.devkitpro.org/a00035.html

【讨论】:

以上是关于在 DS 上结合 3D 和帧缓冲模式的主要内容,如果未能解决你的问题,请参考以下文章

JOGL 和帧缓冲区渲染到纹理的问题:无效帧缓冲区操作错误

打开 gl 计算着色器和帧缓冲区

Android GLES 2.0:帧缓冲渲染到半浮点纹理适用于某些设备,而不是其他设备

为啥用Arcgis10.7建立缓冲区分析图出不来的3D分析

是否可以在opengl中使用深度缓冲区渲染3D纹理

帧缓存的详细介绍