Categories
Tech

ActionScript notes

OpenGL好几天没碰了,这些天扬在准备申请用的作品集,摄影专业的人自然是一堆照片要展示,然后就叫我帮着做个Flash的homepage。一开始打算javascript, html, flash混搭来着,后来实在排版不过来,全站flash了。扬对代码之类的东西不太熟悉,所以我就一直在打包,as3.0的好处真是体现得淋漓尽致。最后把读图、缩略图浏览、放大、滚动这些东西包好,他只要两行代码就能调用。

一些问题记录一下。

1. 判断Loader读取结束的时候,EventListener要加在Loader.contentLoaderInfo上面。

2. 做好的MC要在as里面建实例的话,先写个.as,做个flash.display.MovieClip子类出来(只要有个类定义就行),然后在Library里把MC链接到这个子类上面。用的时候建立那个子类的实例就可以得到MC了。当然,MC用到的Library里的东西得手动复制到新的fla里面。

3. 需要持续移动之类的效果最好还是弄个Timer来,在Timer的event handler里面做事。

4. 注册点要统一,不然一堆MC调来调去的,不断的算相对坐标,疯掉。

Categories
实用玩意儿

3D显示器

USC与Sony合作的研究成果,能够形成如上图的3D图像,原理其实很简单,一面倾斜的旋转的镜子,用高速投影机从上方投影下来即可。下面这张图比较清楚的展示了整个结构。

之前粗略的算了一下,假设人眼的视觉残留是0.1s,那镜子旋转的频率也就是10 Hz才能勉强使影像连贯。而要实现360度可视,360度范围内如果设置n个有对应图像的投影点,那么投影机的频率就至少是10n Hz。这个n怎么也得有三五十个吧?……有刷新频率是三五百赫兹的投影机么?电脑的显卡估计也没法达到这种频率吧……

于是很好奇的找了这个项目的页面来看,找到了论文,在这里下载。才知道这个装置在SIGGRAPH 2007 Emerging Technologies展会上获得了Best Emerging Technology奖。

从论文里看,镜子是用同步电机带动的,转速20圈每秒,每隔1.25度就投一幅图像。而投影机经过了他们的改造,配合自制的驱动电路可以达到4800 Hz的频率。这么变态的频率是因为要满足1.25度一个投影点的需求,显卡频率设置到了200 Hz,也许是出于处理速度的考虑吧,他们将视频的每一帧(RGB, 24-bit)拆成了24帧的binary图像进行投影,所以,200×24=4800。文中还讲了诸如如何处理投影失真的情况等,长达10页,没耐心看完。

最后是一个视频。

Categories
OpenGL

OpenGL notes(4)

这个有点CS的味道了,呵呵。从外部文件读取坐标作图,键盘控制视角的水平移动,也能抬头低头。

Categories
这是生活

又一次丢数据

昨天为了把移动硬盘当Time Machine的备份,折腾了几下,就把分区表弄挂了,原有的4个分区彻底不见,在mac下能挂载上整个盘,但没格式,pc上则完全没反应,甚至partition magic/manager之类的也无能为力,读取分区信息的时候就卡死。四年积攒的照片文档视频全在里面,送去数据恢复公司的心都有了。

后来水木apple版上一位大哥推荐了mac下的Data Rescue II。还真起作用了。扫了通宵,到早晨大部分数据都扫了出来,但是文件夹结构全部消失,文件名变成无意义的顺序编号,按后缀分类存着。于是,从早上到现在我干的事情就是打开每一个文件,然后根据内容重新命名,分类归档。当中有陈年老课件、五花八门的照片、大把的flash和photoshop源文件、doc、xls……因为无路可退,如此恶心的活只能恶心的做了。

尽管如此,还是丢掉了很多东西。比较心疼的是大三甲团flash的fla,学生节海报的psd、大一大二的甲团ppt、孙燕姿的几个演唱会视频和一堆MV……不过班级的东西邵同志的ftp上应该也有一份,小安慰一下。

最后还是下了决心,把250G的硬盘格了,三个分区,一个5G装WinPE应急,一个120G用来Time Machine,剩下当仓库。

Categories
post

七个心理寓言(zz)

偶然看到的,感触良多,先暂存一下,有空加上自己的体会。

(一)成长的寓言:做一棵永远成长的苹果树

一棵苹果树,终于结果了。
第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长。第二年,它结了5个苹果,4个被拿走,自己得到1个。“哈哈,去年我得到了10%,今年得到20%!翻了一番。”这棵苹果树心理平衡了。
但是,它还可以这样:继续成长。譬如,第二年,它结了100个果子,被拿走90个,自己得到10个。
很可能,它被拿走99个,自己得到1个。但没关系,它还可以继续成长,第三年结1000个果子……
其实,得到多少果子不是最重要的。最重要的是,苹果树在成长!等苹果树长成参天大树的时候,那些曾阻碍它成长的力量都会微弱到可以忽略。真的,不要太在乎果子,成长是最重要的。

【心理点评】你是不是一个已自断经脉的打工族?
刚开始工作的时候,你才华横溢,意气风发,相信“天生我才必有用”。但现实很快敲了你几个闷棍,或许,你为单位做了大贡献没人重视;或许,只得到口头重视但却得不到实惠;或许……总之,你觉得就像那棵苹果树,结出的果子自己只享受到了很小一部分,与你的期望相差甚远。
于是,你愤怒、你懊恼、你牢骚满腹……最终,你决定不再那么努力,让自己的所做去匹配自己的所得。几年过去后,你一反省,发现现在的你,已经没有刚工作时的激情和才华了。
“老了,成熟了。”我们习惯这样自嘲。但实质是,你已停止成长了。
这样的故事,在我们身边比比皆是。
之所以犯这种错误,是因为我们忘记生命是一个历程,是一个整体,我们觉得自己已经成长过了,现在是到该结果子的时候了。我们太过于在乎一时的得失,而忘记了成长才是最重要的。
好在,这不是金庸小说里的自断经脉。我们随时可以放弃这样做,继续走向成长之路。
切记:如果你是一个打工族,遇到了不懂管理、野蛮管理或错误管理的上司或企业文化,那么,提醒自己一下,千万不要因为激愤和满腹牢骚而自断经脉。不论遇到什么事情,都要做一棵永远成长的苹果树,因为你的成长永远比每个月拿多少钱重要。

(二)动机的寓言:孩子在为谁而玩

一群孩子在一位老人家门前嬉闹,叫声连天。几天过去,老人难以忍受。
于是,他出来给了每个孩子25美分,对他们说:“你们让这儿变得很热闹,我觉得自己年轻了不少,这点钱表示谢意。”
孩子们很高兴,第二天仍然来了,一如既往地嬉闹。老人再出来,给了每个孩子15美分。他解释说,自己没有收入,只能少给一些。15美分也还可以吧,孩子仍然兴高采烈地走了。
第三天,老人只给了每个孩子5美分。
孩子们勃然大怒,“一天才5美分,知不知道我们多辛苦!”他们向老人发誓,他们再也不会为他玩了!

【心理点评】你在为谁而“玩”
这个寓言是苹果树寓言的更深一层的答案:苹果树为什么会自断经脉,因为它不是为自己而“玩”。
人的动机分两种:内部动机和外部动机。如果按照内部动机去行动,我们就是自己的主人。如果驱使我们的是外部动机,我们就会被外部因素所左右,成为它的奴隶。
在这个寓言中,老人的算计很简单,他将孩子们的内部动机“为自己快乐而玩”变成了外部动机“为得到美分而玩”,而他操纵着美分这个外部因素,所以也操纵了孩子们的行为。寓言中的老人,像不像是你的老板、上司?而美分,像不像是你的工资、奖金等各种各样的外部奖励?
如将外部评价当作参考坐标,我们的情绪就很容易出现波动。因为,外部因素我们控制不了,它很容易偏离我们的内部期望,让我们不满,让我们牢骚满腹。不满和牢骚等负性情绪让我们痛苦,为了减少痛苦,我们就只好降低内部期望,最常见的方法就是减少工作的努力程度。
一个人之所以会形成外部评价体系,最主要的原因是父母喜欢控制他。父母太喜欢使用口头奖惩、物质奖惩等控制孩子,而不去理会孩子自己的动机。久而久之,孩子就忘记了自己的原初动机,做什么都很在乎外部的评价。上学时,他忘记了学习的原初动机———好奇心和学习的快乐;工作后,他又忘记了工作的原初动机———成长的快乐,上司的评价和收入的起伏成了他工作的最大快乐和痛苦的源头。
切记:外部评价系统经常是一种家族遗传,但你完全可以打破它,从现在开始培育自己的内部评价体系,让学习和工作变成“为自己而玩”。

(三)规划的寓言:把一张纸折叠51次

想象一下,你手里有一张足够大的白纸。现在,你的任务是,把它折叠51次。那么,它有多高?
一个冰箱?一层楼?或者一栋摩天大厦那么高?不是,差太多了,这个厚度超过了地球和太阳之间的距离。

【心理点评】
到现在,我拿这个寓言问过十几个人了,只有两个人说,这可能是一个想象不到的高度,而其他人想到的最高的高度也就是一栋摩天大厦那么高。
折叠51次的高度如此恐怖,但如果仅仅是将51张白纸叠在一起呢?
这个对比让不少人感到震撼。因为没有方向、缺乏规划的人生,就像是将51张白纸简单叠在一起。今天做做这个,明天做做那个,每次努力之间并没有一个联系。这样一来,哪怕每个工作都做得非常出色,它们对你的整个人生来说也不过是简单的叠加而已。
当然,人生比这个寓言更复杂一些。有些人,一生认定一个简单的方向而坚定地做下去,他们的人生最后达到了别人不可企及的高度。譬如,我一个朋友的人生方向是英语,他花了十数年努力,仅单词的记忆量就达到了十几万之多,在这一点上达到了一般人无法企及的高度。
也有些人,他们的人生方向也很明确,譬如开公司做老板,这样,他们就需要很多技能———专业技能、管理技能、沟通技能、决策技能等等。他们可能会在一开始尝试做做这个,又尝试做做那个,没有一样是特别精通的,但最后,开公司做老板的这个方向将以前的这些看似零散的努力统合到一起,这也是一种复杂的人生折叠,而不是简单的叠加。
切记:看得见的力量比看不见的力量更有用。
现在,流行从看不见的地方寻找答案,譬如潜能开发,譬如成功学,以为我们的人生要靠一些奇迹才能得救。但是,在我看来,东莞恒缘心理咨询中心的咨询师毛正强说得更正确,“通过规划利用好现有的能力远比挖掘所谓的潜能更重要。”

(四)逃避的寓言:小猫逃开影子的招数

“影子真讨厌!”小猫汤姆和托比都这样想,“我们一定要摆脱它。”
然而,无论走到哪里,汤姆和托比发现,只要一出现阳光,它们就会看到令它们抓狂的自己的影子。
不过,汤姆和托比最后终于都找到了各自的解决办法。汤姆的方法是,永远闭着眼睛。托比的办法则是,永远待在其他东西的阴影里。

【心理点评】
这个寓言说明,一个小的心理问题是如何变成更大的心理问题的。
可以说,一切心理问题都源自对事实的扭曲。什么事实呢?主要就是那些令我们痛苦的负性事件。
因为痛苦的体验,我们不愿意去面对这个负性事件。但是,一旦发生过,这样的负性事件就注定要伴随我们一生,我们能做的,最多不过是将它们压抑到潜意识中去,这就是所谓的忘记。
但是,它们在潜意识中仍然会一如既往地发挥作用。并且,哪怕我们对事实遗忘得再厉害,这些事实所伴随的痛苦仍然会袭击我们,让我们莫名其妙地伤心难过,而且无法抑制。这种疼痛让我们进一步努力去逃避。
发展到最后,通常的解决办法就是这两个:要么,我们像小猫汤姆一样,彻底扭曲自己的体验,对生命中所有重要的负性事实都视而不见;要么,我们像小猫托比一样,干脆投靠痛苦,把自己的所有事情都搞得非常糟糕,既然一切都那么糟糕,那个让自己最伤心的原初事件就不是那么疼了。
白云心理医院的咨询师李凌说,99%的吸毒者有过痛苦的遭遇。他们之所以吸毒,是为了让自己逃避这些痛苦。这就像是躲进阴影里,痛苦的事实是一个魔鬼,为了躲避这个魔鬼,干脆把自己卖给更大的魔鬼。
还有很多酗酒的成人,他们有过一个酗酒而暴虐的老爸,挨过老爸的不少折磨。为了忘记这个痛苦,他们学会了同样的方法。
除了这些看得见的错误方法外,我们人类还发明了无数种形形色色的方法去逃避痛苦,弗洛伊德将这些方式称为心理防御机制。太痛苦的时候,这些防御机制是必要的,但糟糕的是,如果心理防御机制对事实扭曲得太厉害,它会带出更多的心理问题,譬如强迫症、社交焦虑症、多重人格,甚至精神分裂症等。
真正抵达健康的方法只有一个———直面痛苦。直面痛苦的人会从痛苦中得到许多意想不到的收获,它们最终会变成当事人的生命财富。
切记:阴影和光明一样,都是人生的财富。
一个最重要的心理规律是,无论多么痛苦的事情,你都是逃不掉的。你只能去勇敢地面对它,化解它,超越它,最后和它达成和解。如果你自己暂时缺乏力量,你可以寻找帮助,寻找亲友的帮助,或寻找专业的帮助,让你信任的人陪着你一起去面对这些痛苦的事情。
美国心理学家罗杰斯曾是最孤独的人,但当他面对这个事实并化解后,他成了真正的人际关系大师;美国心理学家弗兰克有一个暴虐而酗酒的继父和一个糟糕的母亲,但当他挑战这个事实并最终从心中原谅了父母后,他成了治疗这方面问题的专家;日本心理学家森田正马曾是严重的神经症患者,但他通过挑战这个事实并最终发明出了森田疗法……他们生命中最痛苦的事实最后都变成了他们最重要的财富。你,一样也可以做到。

(五)行动的寓言———螃蟹、猫头鹰和蝙蝠

螃蟹、猫头鹰和蝙蝠去上恶习补习班。数年过后,它们都顺利毕业并获得博士学位。不过,螃蟹仍横行,猫头鹰仍白天睡觉晚上活动,蝙蝠仍倒悬。

【心理点评】
这是黄永玉大师的一个寓言故事,它的寓意很简单:行动比知识重要。
用到心理健康中,这个寓言也发人深省。
心理学的知识堪称博大精深。但是,再多再好的心理学知识也不能自动帮助一个人变得更健康。其实,我知道的一些学过多年心理学的人士,他们学心理学的目的之一就是要治自己,但学了这么多年以后,他们的问题依旧。
之所以出现这种情况,一个很重要的原因是,他们没有身体力行,那样知识就只是遥远的知识,知识并没有化成他们自己的生命体验。
我的一个喜欢心理学的朋友,曾被多名心理学人士认为不敏感,不适合学心理学。但事实证明,这种揣测并不正确。他是不够敏感,但他有一个非常大的优点:知道一个好知识,就立即在自己的生命中去执行。这样一来,那些遥远的知识就变成了真切的生命体验,他不必“懂”太多,就可以帮助自己,并帮助很多人。
如果说,高敏感度是一种天才素质,那么高行动力是更重要的天才素质。
这个寓言还可以引申出另一种含义:不要太指望神秘的心理治疗的魔力。最重要的力量永远在你自己的身上,奥秘的知识、玄妙的潜能开发、炫目的成功学等等,都远不如你自己身上已有的力量重要。我们习惯去外面寻找答案,去别人那里寻找力量,结果忘记了力量就在自己身上。
切记:别人的知识不能自动地拯救你。
如果一些连珠的妙语打动了你,如果一些文字或新信条启发了你。那么,这些别人的文字和经验都只是一个开始,更重要的是,你把你以为好的知识真正运用到你自己的生命中去。
犹太哲学家马丁·布伯的这句话,我一直认为是最重要的:
你必须自己开始。假如你自己不以积极的爱去深入生存,假如你不以自己的方式去为自己揭示生存的意义,那么对你来说,生存就将依然是没有意义的。

(六)放弃的寓言:蜜蜂与鲜花

玫瑰花枯萎了,蜜蜂仍拼命吮吸,因为它以前从这朵花上吮吸过甜蜜。但是,现在在这朵花上,蜜蜂吮吸的是毒汁。
蜜蜂知道这一点,因为毒汁苦涩,与以前的味道是天壤之别。于是,蜜蜂愤不过,它吸一口就抬起头来向整个世界抱怨,为什么味道变了?!
终于有一天,不知道是什么原因,蜜蜂振动翅膀,飞高了一点。这时,它发现,枯萎的玫瑰花周围,处处是鲜花。

【心理点评】
这是关于爱情的寓言,是一位年轻的语文老师的真实感悟。
有一段时间,她失恋了,很痛苦,一直想约我聊聊,希望我的心理学知识能给她一些帮助。我们一直约时间,但快两个月过去了,两人的时间总不能碰巧凑在一起。
最后一次约她,她说:“谢谢!不用了,我想明白了。”
原来,她刚从九寨沟回来。失恋的痛苦仍在纠缠她,让她神情恍惚,不能享受九寨沟的美丽。不经意的时候,她留意到一只小蜜蜂正在一朵鲜花上采蜜。那一刹那间,她脑子里电闪雷鸣般地出现了一句话:“枯萎的鲜花上,蜜蜂只能吮吸到毒汁。”
当然,大自然中的小蜜蜂不会这么做,只有人类才这么傻,她这句话里的蜜蜂当然指她自己。这一刹那,她顿悟出了放弃的道理。以前,她想让我帮她走出来,但翅膀其实就长在她自己身上,她想飞就能飞。
放弃并不容易,爱情中的放弃尤其令人痛苦。因为,爱情是对我们幼小时候的亲子关系的复制。幼小的孩子,无论从哪个方面看,都离不开爸爸妈妈。如果爸爸妈妈完全否定他,那对他来说就意味着死亡,这是终极的伤害和恐惧。我们多多少少都曾体验过被爸爸妈妈否定的痛苦和恐惧,所以,当爱情———这个亲子关系的复制品再一次让我们体验这种痛苦和恐惧时,我们的情绪很容易变得非常糟糕。
不过,爱情和亲子关系相比,有一个巨大的差别:小时候,我们无能为力,一切都是父母说了算;但现在,我们长大了,我们有力量自己去选择自己的命运。可以说,童年时,我们是没有翅膀的小蜜蜂,但现在,我们有了一双强有力的翅膀了。
但是,当深深地陷入爱情时,我们会回归童年,我们会忘记自己有一双可以飞翔的翅膀。等我们自己悟出这一点后,爱情就不再会是对亲子关系的自动复制,我们的爱情就获得了自由,就有了放弃的力量。
切记:爱情是两个人的事情,两个完全平等的、有独立人格的人的事情。你可以努力,但不是说,你努力了就一定会有效果,因为另一个人,你并不能左右。
所以,无论你多么在乎一次爱情,如果另一个人坚决要离开你,请尊重他的选择。
并且,还要记得,你不再是童年,只能听凭痛苦的折磨。你已成人,你有一双强有力的翅膀,你完全可以飞出一个已经变成毒药的关系。

(七)亲密的寓言:独一无二的玫瑰

小王子有一个小小的星球,星球上忽然绽放了一朵娇艳的玫瑰花。以前,这个星球上只有一些无名的小花,小王子从来没有见过这么美丽的花,他爱上这朵玫瑰,细心地呵护她。
那一段日子,他以为,这是一朵人世间唯一的花,只有他的星球上才有,其他的地方都不存在。
然而,等他来到地球上,发现仅仅一个花园里就有5000朵完全一样的这种花朵。这时,他才知道,他有的只是一朵普通的花。
一开始,这个发现,让小王子非常伤心。但最后,小王子明白,尽管世界上有无数朵玫瑰花,但他的星球上那朵,仍然是独一无二的,因为那朵玫瑰花,他浇灌过,给她罩过花罩,用屏风保护过,除过她身上的毛虫,还倾听过她的怨艾和自诩,聆听过她的沉默……一句话,他驯服了她,她也驯服了他,她是他独一无二的玫瑰。
“正因为你为你的玫瑰花费了时间,这才使你的玫瑰变得如此重要。”一只被小王子驯服的狐狸对他说。

【心理点评】
这是法国名著《小王子》中一个有名的寓言故事,我曾读过十数遍,但仍然是直到2005年才明白这一点。
面对着5000朵玫瑰花,小王子说:“你们很美,但你们是空虚的,没有人能为你们去死。”
只有倾注了爱,亲密关系才有意义。但是,现在我们越来越流行空虚的“亲密关系”,最典型的就是因网络而泛滥的ONS(注:中文那个词被拦截-___-)。
我们急着去拥有。仿佛是,每多拥有过一朵玫瑰,自己的生命价值就多了一分。网络时代,拥有过数十名情人,已不再是太罕见的事情。但我所了解的这些滥情者,没有一个是不空虚的。他们并不享受关系,他们只享受征服。
“征服欲望越强的人,对于关系的亲密度越没有兴趣。”广州白云心理医院的咨询师荣玮龄说,“没有拥有前,他们会想尽一切办法拉近关系的距离。但一旦拥有后,他们会迅速丧失对这个亲密关系的兴趣。征服欲望越强,丧失的速度越快。”
对于这样的人,一个玫瑰园比起一朵独一无二的玫瑰花来,更有吸引力。
然而,关系的美,正在乎两人的投入程度和被驯服程度。当两个人都自然而然地去投入,自然而然地被驯服后,关系就会变成人生养料,让一个人的生命变得更充盈、更美好。
但是,无论多么亲密。小王子仍是小王子,玫瑰仍是玫瑰,他们仍然是两个个体。如果玫瑰不让小王子旅行,或者小王子旅行时非将玫瑰花带在身上,两者一定要黏在一起,关系就不再是享受,而会变成一个累赘。
切记:一个既亲密而又相互独立的关系,胜于一千个一般的关系。这样的关系,会把我们从不可救药的孤独感中拯救出来,是我们生命中最重要的一种救赎。
如果不曾体验过,你就无法知道这种关系的美。

Categories
这是生活

签证到手

下午轮滑回来,收拾好准备做饭,EMS的人来敲门,说早上来敲没人……其实是我在睡觉没听见,汗,很死。护照上贴了个精美的小纸条,有效期一年,明年十月还得在那续签了看来。外加一张白纸。其余材料原封不动的一并寄了回来,成绩单都没有开封。

很久没运动了,累得不行,洗洗睡觉。

Categories
OpenGL

OpenGL notes(3)

做了几件事:

1. 贴图上去,生成texture。

2. 可以用键盘控制转动速度和视角远近。

3. 可以选择贴图的插值方式(Nearest, Linear & MipMapped)。在拉近视角的那一段演示了三者的区别,可能要用高清模式才能看清。后二者在这里没区别,因为箱子是很标准的256^3,第一个则可以看出来颗粒。

4. 灯光。设置了两个光源,一个是ambient的白光,亮度50%,另一个是diffuse的白光,亮度100%,位置固定。结果居然是看到箱子在两面显得暗,转到另外两面就变亮了。现在还不知道坐标是怎么设置的,也许是因为这里相对于空间转动的是视角而不是箱子吧。

update about 4:
检查了一个晚上,发现原来是在绘制立方体的时候没有用glNormal指定每个面的法向量,导致了光线诡异的变化。修改之后就正常了,下面这段视频是在修改后的基础上加入blending,实现透明效果。

Categories
OpenGL

OpenGL notes(2)

昨天夜里到今天夜里,解决了两个主要问题:如何读取BMP文件来构建CGImage对象,以及如何把24-bit的BMP做成纹理放到OpenGL里。

第一个问题就贴一段代码好了。

CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyResourceURL(bundle, CFSTR(“filename”), CFSTR(“bmp”), NULL);
//然后调用LoadImage(CFURLRef url),就可以得到一个CGImageRef了。
CGImageRef LoadImage(CFURLRef url)
{
if (!url)
return NULL;

CGImageSourceRef isr = CGImageSourceCreateWithURL (url, NULL);
CGImageRef ir = CGImageSourceCreateImageAtIndex (isr, 0, NULL);

return ir;

}

整个过程相当郁闷,折腾了半天url总是NULL,后来才找到这个比较通用的流程。如果在windows下应该只需要读进来一个File扔给auxDIBImageLoad()就可以了,无奈在Mac下最好的替代也许就是这个CGImage,只好硬着头皮上。

第二个问题就更是体现出CGImage的怪异。

事情是这样的。glTexImage2D需要的纹理数据存放在一个空间(就叫myData)里面。已经读入的要作为纹理的图片构成的CGImage对象由ir这个指针指向。于是,必须用CGBitmapContextCreate(…)来把CGImage的数据提取出来放到myData里。而这个函数只支持有限的几种图片模式(具体可见http://developer.apple.com/qa/qa2001/qa1037.html),也就是说OS/2下面24-bit的RGB三通道的BMP是不能直接用的。然后,我就迷糊了:我读入这个图片之后,在CGImage对象里面被存成什么样了呢?如果直接读取它的BitmapInfo传进去,报错说不支持这种模式。于是就得从支持的模式里面挑一中来强制转换。最后我才算明白,恶心之处就在于CGImage把RGB的存放方式改了,而且加上了Alpha通道,放在一个32-bit的结构里,但你用CGImageGetBitmapInfo()读取出来的只是转换之前的信息。经过半天摸石头过河的实验之后才搞清楚,RGB的24-bit被变成了顺序为RGBA的32-bit。所以应该用kCGImageAlphaPremultipliedLast或者kCGImageAlphaNoneSkipLast把Alpha扔掉才行。

并且,在glTexImage2D函数里面,internalformat要用GL_RGB,format要用GL_RGBA,才能把纹理正确渲染出来。因为前者是指定纹理的储存和绘制方式,后者是指定myData里的数据是以什么格式储存的。

最后,我用Photoshop做了个RGBA的32-bit BMP放进去,BitmapInfo参数用实际读取的结果做参数居然还是报告不支持该模式,nnd,也不应该是Big-endian和Little-endian的问题啊……再说了。

Categories
OpenGL

OpenGL notes(1)

有关Framework。

今天遇到一个问题。某个例程里面用了#include 调用了Mac OS X自带的OpenGL库,编译正常。在尝试用贴图渲染3D物体时,NeHe教程里用了AUX_RGBImageRec来储存读入的图片,而这个类型是包含在glaux库里的,这个库又是windows only的。Apple给的官方说明给了一些选项来完成mac中的相同任务,一是用Cocoa的NSView类,二是用Quartz的image source,三是直接从解压的文件里读入Raw数据。当然,我选了第二个。系统的ApplicationServices/CoreGraphics.framework/CGImage.h里面定义了Quartz的图像数据类型CGImageRef,所以,我得把这个头文件include进去。可是导入了ApplicationServices Framework到工程里,在头文件里用#include 却总是报错,no such file or directory。而在工程浏览器里CGImage.h明明在ApplicationServices下面……后来翻Xcode的文档才发现,涉及深层次的问题。

Mac下面的Framework都是用bundle的形式提供的,一个bundle里面可以共存多种版本,保证了对旧版本程序的支持。为了为特定的应用环境提供必需的编程接口,Apple在标准的Framework之外还提供了Umbrella Framework。照我的理解,UF顾名思义应该是期望用伞架的结构,讲分散在各个Standard Framework里的subframework虚拟的链接起来,形成针对某种特定应用的新的framework。与Standard Framework不同,UF并不把它的subframeworks里的头文件都包括进来,而仅仅包含那个framework的master header file,也就是与framework同名的那个。因此,在调用UF的时候,只需要include这个头文件即可。这样也带来一个好处,就是如果Apple对某个framework里的东西进行了修改,开发者并不需要对他们的代码做改动,因为那个master header file总是不会改变的。

好了,废话这么多,最终结论就是,只需要#include 就可以。

Categories
Tech

OpenGL之纠结

今天开始配OpenGL的编译环境。

目前,根据我的理解,OpenGL并没有提供统一的SDK,所以有GLUT, freeglut之类的东西并存,安装之后,它们就能提供OpenGL编译所需要的一系列接口。

首先试了Mac OS X。其实没多想就放弃了。这姑娘长得那么漂亮,就没个编程的氛围……

然后就开Parallels拿Ubuntu 8.04出来。很轻松的apt-get install一下,就装上了libglut和freeglut等4个包。网上抄了一段测试代码,写好makefile,编译,通过,跳出来一个渲染后的窗口。但是console里很显眼的报错:freeglut: unable to create direct context rendering for window ‘xx’。google了一下,问题在于显卡的硬件加速没有发挥作用。从跳出来的窗口上也可以感觉到确实有些不顺畅。于是,找了nvidia的驱动来装。估量着Pro的显卡还是比较新的,8600M GT,所以装了nvidia-glx-new(-dev)。而且这个new的东西也确实是为8.04的新内核而生的。

但是,装完之后又出现新问题,连运行都不能了。编译、链接通过,运行直接报错:freeglut: OpenGL GLX extension not supported by display ‘:0.0’。再google,说是freeglut,libglut的库和nvidia驱动自带的库不能共存。!×·&……#¥×(!……#

之后看到有一篇文章,面对这种情况时,某人用mesa编译了库来用软件加速,直接无视nvidia的东西。于是照猫画虎,我也弄了mesa来编译。不见起色……怀疑是nvidia还在的缘故,于是又删了驱动,重装freeglut & libglut,重启,又弄出来新的问题,找不到-lGL。手动跑了一次ldconfig,还是死样。又把驱动装回来,编译过了,运行又是unable to create……回到原点。这时候真是严重的心烦意乱,懒得再折腾LIBRARY_PATH啥的了,估计是用虚拟机跑的时候显卡驱动比较土吧。

最后收拾收拾,还是回到Mac下了。正好翻到NeHe的OpenGL教程,里面居然有专门针对OS X的说明!OS X里也有自带OpenGL Framework。nnd。。。正好之前也装了Xcode,就下了一段sample code来。结果……一下通过……运行顺利……出现了一个可爱的红色三角形……

叹,虽然是绕了个大圈,花了大半天时间,最后的结果还是成功的,不仅可以动手写东西了,而且能舒服的呆在Mac下享受漂亮的界面而不必忍受Parallels上面奇怪的Linux(btw, Parallels跑Linux居然不能与OS X之间copy/paste,官方的解释也是无能为力。这叫人怎么用……)。

发泄完毕。