在OpenGL中怎么定义超过8个的光源?求教OpenGL高手。

LJN 2000-07-03 12:04:00
我们知道,在OpenGL中预设了8个光源,可以方便的EnableLight(LIGHT0-7)来打开它,
在现实生活中可能同时有十几道光源射向一个物体,超过8个该怎么做呢?
在3DSMax中光源似乎做成了一个类,也就是说可以例示任意多个实例,如果我们也建造
一个类,有什么方法可以实现呢?(关于类的问题有思路就行)
...全文
443 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LJN 2000-07-10
  • 打赏
  • 举报
回复
看来不会有人和我一起开发3DShow了,算了...给分了!!
LJN 2000-07-07
  • 打赏
  • 举报
回复
1。OpenGL之所以流行就是因为它的设备无关性,如果多于8个的光源需要特殊的硬件
支持,就失去了不失一般性的意义。看来选择只有两个:1如上lazypiggy所说的
选择法(效果受到限制),2自定义软接口(目前技术力量难以达到)。

2。我想做成类的目的就在于允许用户交互。用程序画静态图没什么意义。
用数组储存包括顶点等等在内的属性是很显然的,光这一层的数据结构定义
并不太难,问题的关键在于一整套的数据结构与程序框架的协调上,这包括:
创建,选取,修改,多视口多方位显示,对象的串行化,转换成媒体文件,
各种渲染效果的设计,还有很多...。以上各模块都不能独立存在,而必须
考虑他们的相互作用。这就是我头大的地方。
经过一段时间的模和,我的思路已较清晰,但是有很多细节未考虑。这就是
设计文档迟迟出不来的原因。

其实我曾经邀请过一些网友参与设计,但大家显然有些...。
不知在座的各位可有和我一样不怕死的?
lazypiggy 2000-07-06
  • 打赏
  • 举报
回复
其实这个问题很容易解决。

你可以设置多于8个的光源,但是render每个平面的时候只使用最多8个(因为目前OPENGL的版本的限制)。对于任何一个平面,计算每个光源对它的影响,选出最多8个影响最大的分别设置为光源0-7,然后打开这些光源,RENDER这个平面。如此继续直到所有平面处理完毕。

对于一个大的场景,这样可以产生有多于8个光源的效果(从总体上来说)。
jfly 2000-07-06
  • 打赏
  • 举报
回复
1、关于8个灯光(我在OpenGL.org询问后得到的多个人的解释综合而得):
i)3DMAX只是在作图时使用OpenGL,但是在成品渲染时,用的是自己的软接口——HEIDI。
ii)OpenGL确实可以支持超过8个灯光,但是取决于显卡。你可以用glGetIntegerv(GL_MAX_LIGHTS)来获得硬件支持的最大灯光数,但是,普通显卡OpenGL下只支持8个,3Dlabs GAMMA -16个,Wildcat 4210 -24个。
2、3DMAX大概不会用类,用Type应该可以解决问题(甚至也不需要)。其实,3DMAX的问题我也想过。
i)如果画出的物体不再修改,那么好办,画一个物体创建一个list就行,这我写过一个例程。
ii)如果画过的物体还要修改,就必须把每个物体的参数记下来,参数可以用数组来存储。至少需要这样一些数组:顶点(不论是什么东西,顶点是一切的基础)、顶点颜色、动作(点、线、立方体、曲线等),这样的思路应该可以实现吧,而且很清晰啊。
谁能这样写个例程?

LJN 2000-07-06
  • 打赏
  • 举报
回复
to lazypiggy:

你说的方法的确值得考虑,在用3DMax时光点到了一定的数量以后,也很难
分清哪个点发光.但只是相对远距离而言,如果画一个大的物体,在距它很近的地方
打上>8个光,将得到>8个光点, 这表示这>8确实存在.
这几日大家参与讨论, 我很感谢. 不过总体来说, 似乎咱们都没有办法把它做
成类. 而3DMax却实现了无限光,我们再想想有什么方法可以实现吧. 如果都没办法
的话 我到比较赞同lazypiggy的选择法.
茂奇软件 2000-07-05
  • 打赏
  • 举报
回复
I think it is mission impossible.
jansen zhu.
LJN 2000-07-05
  • 打赏
  • 举报
回复
先谢谢jfly的回答!

1.对于一般的图像来说,8道光已显足够.再多只会影响速度.我也并不想这样做.
但是看到3DMax它能够随意设置光点,我试过设置上百个都没问题.
既然3DS它能实现而且也是基于OpenGL,那我们也应该能实现.
2.我正在设计一个类似3DMax的程序(当然跟它没法比),如此复杂的数据结构不用类,用什么呢? 用结构吗? 我在设计程序框架时已经感到很头大(太复杂了),不用类简直无法控制.

综上所述,就是怎样模仿3DMax达到无限制光源.即使是抛弃类,而改用全局函数和结构的方式也在所不惜.
jfly 2000-07-05
  • 打赏
  • 举报
回复
1、OpenGL只支持最多8个光源。故只能EnableLight(LIGHT0-7)。
据真正的3D高手说:灯光越多,效果越差(乱)。尽量不要把现实生活拿进来比较。
2、最好不要做成类,而且要尽量用C代码。据说C++比C要慢30%。OpenGL本身是纯C的。
为了程序的稳健,3DSMAX应该不会用类吧,通常都是通过自定义Type来实现的。
LJN 2000-07-05
  • 打赏
  • 举报
回复
难道..真的..没人..理我..
来讨论一下吧. 没人用OpenGL吗!!
LJN 2000-07-04
  • 打赏
  • 举报
回复
怎么没人关心这个问题吗?

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧