平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

像素级上的3D空间

写PixelShader写多了,就有一种像素级上的3D空间的直觉,一张照片还原出整个3D场景是现实的了.

Defer Shader用的就是这种技巧,第一次渲染把场景的3D信息收集在每个像素的数据上,其后耍各种数学技巧渲染这张富数据的照片即可,美其名曰Post Effect.

成像的要求也不过是要到像素级上,只要有像素级的空间信息,不一定非要世界级的空间信息.每个像素可以还原自己的世界空间位置,世界法线,颜色,最终成像的位置.

像素的每一点即空间中的每一点.

许多图形学问题在像素级3D空间中作思考,在直觉上会比较容易,而在Vertex世界空间中想象有点困难.

嗯,这有点抽象.

posted @ 2007-10-19 23:21 linghuye 阅读(908) | 评论 (0)编辑 收藏

OpenGL中所有受当前ModelViewMatrix影响的参数设定

glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
The position is transformed by the modelview matrix when glLight is called (just as if it were a point), and it is stored in eye coordinates.
如上,传入的光位置参数是定义在模型坐标系下的,但被保存在镜头空间中(即固定管线将其视为镜头坐标系下的语义使用).且除非再次指定,该值不变,即相当于光的位置相对镜头固定.这通常不是我们想要的,通常光应该相对世界固定(如DirectX).所以需要在每次变更ModelViewMatrix后再次设置光的位置,以表明其相对世界固定.


glClipPlane:
When you call glClipPlane, equation is transformed by the inverse of the modelview matrix and stored in the resulting eye coordinates. Subsequent changes to the modelview matrix have no effect on the stored plane-equation components.
即不同于glLightfv, glClipPlane指定的平面公式参数受到当前ModelViewMatrix逆矩阵的影响(没想到吧),实际存储的数值为: 传入的平面公式参数四元组 P 乘以 (ModelViewMatrix ^ -1). 需要特别指出的是,这里的计算是P * M,而不是OpenGL习惯的M * V.


glTexGenfv:
与glClipPlane相同,GL_EYE_LINEAR模式下的纹理坐标自动生成,参数指定的平面公式系数4元组,受到当前ModelViewMatrix逆矩阵影响后存储在镜头空间,即: P * (ModelViewMatrix ^ -1)。但GL_OBJECT_LINEAR没有这种特性。
推论:
1.分别为(s,t,r,q)这4个纹理坐标分量定义一个平面公式,实际上可以理解为定义了一个纹理坐标转换矩阵Ma,这个Ma与纹理变换矩阵glMatrixMode(GL_TEXTURE)机制是相互独立的,也就是说纹理坐标自动生成机制可以提供一个额外的纹理变换矩阵. 通过glTexGenfv(GL_x, GL_EYE_PLANE, ...)可以指定矩阵的4个行向量,记这个矩阵为Ma.

2.平面公式定义下的纹理坐标自动生成可以总结为 M * V.

3.在GL_OBJECT_LINERAR模式下, V是模型坐标系的坐标, M等于Ma.

4.在GL_EYE_LINEAR模式下就复杂多了,glTexGeni(GL_X, GL_TEXTURE_GEN_MODE, GL_EYE_LINERE)负责直接获得镜头空间的坐标值,但是得到后要先乘以使用glTexGenfv(GL_X, GL_EYE_PLANE, m)指定的平面方程(STRQ这4个平面方程组合相当于一个4x4矩阵),再乘以当前ModelViewMatrix的逆矩阵,即设V是取得的镜头坐标系下的坐标,M = Ma * (ModelViewMatrix ^ -1).其中ModelViewMatrix是执行glTexGenfv时的ModelViewMatrix.Ma是平面方程组合矩阵,纹理坐标总公式为:

 Vtex = Ma * (ModelViewMatrix1 ^ -1) * TextureMatrix * ModelViewMatrix2 * Vobject
其中: Ma是glTexGenfv(GL_x, GL_EYE_PLANE, ...)定义的平面公式矩阵
         ModelViewMatrix1是指定glTexGenfv时的ModelViewMatrix,为了得到视图矩阵的逆矩阵,我们总是应该在当前只指定了gluLookAt的时候调用glTexGenfv.
         ModelViewMatrix2是实际渲染时的ModelViewMatrix
         TextureMatrix是纹理矩阵
         Voject是模型顶点坐标.

5.假设当前Batch渲染时的ModelViewMatrix等于glTexGenfv指定时的ModelViewMatrix,且没有TextureMatrix作用,依矩阵乘法结合率,则有 Vtex = Ma * Vobject,等同与GL_OBJECT_LINERAR模式.这就是为什么有的时候GL_EYE_LINEAR和GL_OBJECT_LINEAR的图像没有差别的原因.

6.假设当前Batch渲染时的ModelViewMatrix不等于glTexGenfv指定时的ModelViewMatrix,通常的技巧设置glTexGenfv指定时的ModelViewMatrix为纯ViewMatrix(即用gluLookAt指定),随后镜头不再变换,ModelViewMatrix仅追加ModelMatrix变换,ViewMatrix不变,即有:
Vtex = Ma * (ViewMatrix ^ -1) * ModelViewMatrix * Vobject = Ma * (ViewMatrix ^ -1) * Veye = Ma * Vworld
就是说Ma神奇地作用到了物体的世界坐标上了,这就是Project Texture, Shadow Map使用固定管线渲染时大量应用的技巧.

Shader编程大大降低了一些图形学技巧的复杂性,但我坚持要知其然,知其所以然.

posted @ 2007-10-19 23:20 linghuye 阅读(2058) | 评论 (0)编辑 收藏

当当网是一家没有信用的公司

去年,当当网搞活动将我设为临时黄金VIP会员,现在我在当当网上买书已超两千,
根据他们的条款:

黄金VIP条件: 2)05年至今现金购物累计1000元(含)以上;
钻石VIP: 2)05年至今现金购物累计2000元(含)以上;

我应该被设为钻石会员,但现在当当网不但没给自动给我升级钻石VIP,还撤销了我黄金VIP资格!这是名目张胆的商业欺骗!
我第一次投诉后,客服代表10005装傻充愣,说不清楚我的投诉含义,极尽拖延之事,每次都照抄一段文字答复我:

亲爱的顾客:

您好!感谢您在当当网购物。

当当网的所有客户都可以在当当网购物参加积分活动(购物券金额及送货费用包装费用均不参加积分活动),系统会自动统计积分,达到VIP标准,系统将会于款项到过当当网的帐户的下周左右为客户的帐户升级,届时也会邮件通知客户.如果您的帐户达到VIP标准,便可以耐心等待,帐户升级VIP成功时,便可以得到当当网的确认通知.

您上封邮件需要查询什么问题,请详细说明情况,以便查询处理

给您带来的不便请谅解,感谢您对当当网的支持与理解!祝您购物愉快!

妈的这是什么回答!这算解释吗?当当网还是家作商务的公司吗?你们的客服代表10005是弱智,还是把我当弱智!!!

之后,我每天使用自动添单工具填写百多封投诉评论,而当当网则每天陪着我删贴,最后干脆也就封掉我评论的功能.

而每次网站上的的投诉,其客服干脆也就不回信了,或者直接扯谎说已经给我升级了,实际上是没有的.

也许当当网认为升级个钻石会员很麻烦,而我得让它惹更大的麻烦,让它付出更大的成本,我这个人是睚眦必报的.

卓越网的服务现在比当当好得多,虽然物流还是慢得像蜗牛,态度还是好的,所以已转向卓越买书. 当当的钻石VIP对我没有实际意思,但这口气还是要争的. 年轻人,火力壮.

posted @ 2007-09-26 21:33 linghuye 阅读(1533) | 评论 (4)编辑 收藏

为什么会有右手坐标系和左手坐标系?

假设有两个几何体世界,它们的坐标系不同,分别为右手和左手坐标系,但两个世界有完全一样的物体,即两个世界的对应物体的三角顶点坐标都完全一样.然后在同样的方位上摆上一个摄像机,那成像场景是否一致?
起初从直觉上我怎么想,都觉得都应该是一样的,完全一样的物体坐标,完全一样的镜头位置,在每个孤立的坐标系统下都应该有一样的效果.但是原先以OpenGL坐标系构建的世界,在DirectX下我看到了一个奇幻的左右颠倒的世界.我在纸上画出两个坐标系,才发现原来真是这样,左手坐标系和右手坐标系本质上是两个左右颠倒的世界,而非以前所以为的Z正轴的朝向区别.

在实际的API中,无论OpenGL/DirectX都可以实现左右手坐标系.DX可以使用D3DXMatrixLookAtRH和D3DXMatrixPerspectiveFovRH来实现右手坐标系.OpenGL可以使用手动构建左手视图和投影矩阵来实现左手坐标系,毕竟左右手只是图形API中Transform的部分.

posted @ 2007-06-24 21:59 linghuye 阅读(14214) | 评论 (10)编辑 收藏

多线程,害死人.

DirectX的多线程问题,DirectX使用了D3DCREATE_MULTITHREADED标志真的就安全了吗,怀疑,深深的怀疑.

posted @ 2007-06-13 17:50 linghuye 阅读(4569) | 评论 (12)编辑 收藏

OpenGL/DirectX高级编程Bug

低级编程错误的根由是粗心造成的,而这里所谓高级编程错误源自各版本驱动程序的Bug和一些不合理的API接口,此类错误通常令人吐血,出现一个都要耗费数小时甚至数天来解决,这是个实际经验累计的过程,痛苦而又必要.

1.要求D3DXCreateTexture创建D3DFMT_A8R8G8B8格式纹理,在某些显卡(MX4000,Intel82815,FX5200)的某些驱动程序环境下,会意外地返回D3DFMT_A4R4G4B4,导致程序写内存错误,系统崩溃,蓝屏报告显卡驱动程序DLL错误,文字呈现白色方块等一系列错误现象.切记,不能相信D3DXCreateTexture.

2.表象上,单句g_D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, s_vec, sizeof(LineVertex));渲染2D图象,消耗很高,达100-200ws,但实际应为4-10ws,且此消耗值不稳定浮动.将原顶点格式从D3DFVF_XYZRHW | D3DFVF_DIFFUSE改成D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX0后下降至正常的数值,但其他格式的渲染消耗又上升.此渲染状态的切换导致的消耗,非DrawPrimitiveUP之过,只因此句Draw恰逢渲染状态切换.Shader状态变化(SetVertexShader)伴随在谁身上,谁的消耗就最大,该消耗是100ws级的.

3.使用XP远程桌面登录启动D3D游戏时,DirectX设备创建失败.具体原因是,远程登录方式无法使用显卡硬件,在获取显卡硬件设备GetDeviceCaps时错误.

4.SetTexture(stage, NULL)在高端显卡上会关闭该stage的纹理作用,在低端显卡上不会.据MSDN理论上其含义应该等同于设置为一个黑色不透明的纹理,但NVidia显卡遵循OpenGL标准,等同于设置一个全白纹理.有些显卡会自动禁用该纹理层,等同D3DTOP_DISABLE.

5.Nvidia 7950GT上,使用 
glInterleavedArrays(fvf, 0, pVertexPointer);
glDrawElements(primType, primCount, GL_UNSIGNED_SHORT, pIndices);
memset(pVertexPointer, 0, size);
最后一步的数据清空竟然会影响glDrawElements的结果!导致渲染错误.其他显卡无此问题,最新驱动仍未解决此问题,只能使用glXXXPointer来实现兼容.

6.ATI的GLSL其慢无比. X1650XT比Geforce6150高出一代,而同一个GLSL Skinning animation Shader, Geforce 6150跑200多帧,而X1650竟然只跑39帧,用HLSL实现的Shader则可以跑500帧.所以除非ATI对驱动程序作优化,这个问题无法解决.

7.在激活纹理坐标数组模式时,即使启用了自动生成纹理,也需要显示设置glTexCoordPointer为NULL,否则有崩溃的可能.

8.ATI 7500在CreateVertexBuffer时指明顶点FVF,而后在DrawIndexPrimitives时蓝屏崩溃(6.5驱动),改为不指明FVF,即设为0后正常.

9.渲染出的场景全白, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB) 被打开. 

10.OpenGL中压缩纹理作glTexImage2D后马上glGetTexImage,会取不到数据,不稳定. ATI 1650XT 驱动8.1,发现此问题. Nvidia显卡无此问题,似乎glTexImage2D是异步的.

11.在不支持NPOT的机器上,创建非2的幂次方的RenderTarget纹理,使用D3DXCreateTexture,返回的纹理尺寸可能被扩整到2的幂次方大小,此时需要特别注意最后将RenderTarget渲染到屏幕的范围.

12.在RenderTarget上绘图,先ClearBuffer,然后将场景画在RenderTarget上. 最后将RenderTarget以FVF_XYZRHW的格式画一个Quad到屏幕上. 其他显卡均正常,但在ATI 2400XT上只看到ClearBuffer的背景,没看到场景. 更换数款驱动程序无效,最后吐血发现是XYZRHW的w值为0.0会产生此灵异现象,改为1.0后解决. 仅在ATI 2400XT上发现此Bug,其间陆续借用别人机器调整了6个小时,痛苦
.

13.DX8.1同一个游戏程序,频繁启动,关闭,即频繁启动DX,关闭DX。 或者在多个游戏窗口间切换,(可能伴随启动关闭),发生D3DRS_ALPHABLEND状态丢失现象,即原本始终打开的D3DRS_ALPHABLEND,被莫名关闭,原因不明.

posted @ 2007-06-12 22:59 linghuye 阅读(2339) | 评论 (2)编辑 收藏

Blend混合与纹理函数的亦同

Blend指GL_BLEND机制,纹理函数指glTexEnv机制.
两者本质上都是在成像的过程中,将之前过程得到的颜色值与当前步骤作用的颜色值,使用某种公式或规则算得一个结果颜色.
Blend的公式由glBlendFunc指定,纹理函数由glTexEnv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_XXX)指定.
Blend的Source是当前FragmentShader运算的结果,Dest是之前已经存储在帧缓冲区中的像素颜色值.混合发生在光栅化为Fragment后,但在最终的像素被绘制到帧缓冲区之前.
纹理函数的Source是之前纹理单元的计算结果(第一个纹理单元之前的颜色为光照计算的结果或无光照时的顶点颜色值),另一个因子是当前纹理单元的颜色值.
Blend混合渲染作用于两个渲染Pass之间,纹理函数作用于某个渲染Pass中的两个纹理单元之间.
显然,Blend在整体方程式的更高层,能实现(T1 * T2) + (T3 * T4)这种方程,而只靠固定管线的纹理函数机制,即使有多层纹理单元,也不能实现这个方程.当然,可编程Fragment Shader可以实现任何自定的混合公式.

The process by which the final fragment color value is derived is called the texture environment function.
Typically, applications generate white polygons, light them, and then use this lit value to modulate the texture image to effectively produce a lit, textured surface.

posted @ 2007-06-10 11:22 linghuye 阅读(1136) | 评论 (0)编辑 收藏

暴雪新游戏 - 星际争霸2

 乐翻了,想起我黑暗的大学时代.

posted @ 2007-05-19 15:54 linghuye 阅读(1297) | 评论 (2)编辑 收藏

福州,国家模范环保城市?

自从搬入新家,晋安河对面那个公园里跳舞的那撮中年人就成了我处心积虑要对付的人.
每天早上7:30-10:30,中午14:30-17:30,晚上19:30-21:30,那个高音喇叭音箱就开始播放沉重的鼓点舞厅歌曲,不规律的咚咚声,透过密闭的门窗,极大地影响了我的休息和学习.

福州人的性格是典型的好逸恶劳,就是说闲人很多,大白天在公园里跳个群众自发的舞蹈自然也不稀奇,我想有关部门还要借此树立榜样,弘扬一下社会主义精神文明.所以,人多了壮胆,道德这东西也就丢一边了,自己happy,哪里管得别人死活.

我于是对老婆说,要搁国外,我早就叫Police管了,后来上网一查,才知道这种事搁我们伟大的祖国原来也是归police管的.这属于公园社会活动噪音,<中华人民共和国环境噪声污染防治法>第45条明文规定不得在住宅密集区使用高音喇叭.但是,我们敬爱的police们大案要案都查不过来,哪里会理会我们小民这些听觉上的不适呢.于是我报了3次110,警察同志都说要管,还有一个听起来是个年轻的同志,对我表示了同情,最后明白地说他们也不好管,毕竟都是人民内部矛盾.

于是,我上了个福州有个叫12345的便民呼叫中心网,因为是网上投诉,于是最近我每星期都copy,paste投诉它两三次,这招是学<肖恩克的罪赎>里的男主角,而且成本比较低,简单可行,当然我也不指望它能解决这个问题,果然福州园林局的官僚们只回复了一句,经查没有此问题,就很爽快把我打发了.

福州,2004年12月24日被国家环保总局授予"国家环保模范城市",那检查前的如火如荼的突击卫生大扫除,在党教育下成长的我们都是心领神会的.安徒生有篇<皇帝的新衣>,我个人认为福州园林局的官僚们是看不懂的,福州晋安分局的police们是看不懂的,河对岸那撮伊伯伊姆是看不懂的,因为那需要廉耻心。搜索一下晋安河,触目惊心的出现的尽是污染,浮尸,卖淫,噪音这些词汇,可见福州治安之乱不逊广州。而外地人的只知有厦门而不知福州为何,不如把省会移至厦门。
我觉得,我们中国人作为一个人时是极有廉耻心,而当人群聚拢时是谈不上廉耻心的,人人都相互观望,若别人作得,我亦作得,别人不管,我也不管。当整个城市的人在政府的指导下弄虚作假,搞短期行为,评上环保城市后,再继续糟蹋这个城市。

福州,国家模范环保城市?狗屁!

截至今日,报警110计4次,网上投诉6次,未见解决.

References:
这就是福州的园林局,福州的Police,福州的伊姆伊伯们!
http://www.fz12345.gov.cn/detail.jsp?callid=07051000109
http://www.fz12345.gov.cn/detail.jsp?callid=07042600099
http://www.fz12345.gov.cn/detail.jsp?callid=07041700081
http://www.fz12345.gov.cn/detail.jsp?callid=07040900129
http://www.fz12345.gov.cn/detail.jsp?callid=07040500034
http://www.fz12345.gov.cn/detail.jsp?callid=07022800027
http://www.fz12345.gov.cn/detail.jsp?callid=07010400011
http://12345.fuzhou.gov.cn/detail.jsp?callid=07051500045
http://12345.fuzhou.gov.cn/detail.jsp?callid=07051600050
http://12345.fuzhou.gov.cn/detail.jsp?callid=07040700002
http://12345.fuzhou.gov.cn/detail.jsp?callid=07021000040
http://12345.fuzhou.gov.cn/detail.jsp?callid=07020200068
http://12345.fuzhou.gov.cn/detail.jsp?callid=07020100067
http://12345.fuzhou.gov.cn/detail.jsp?callid=07012500062
http://12345.fuzhou.gov.cn/detail.jsp?callid=07051200043&code=827454
http://12345.fuzhou.gov.cn/detail.jsp?callid=07050200047
http://12345.fuzhou.gov.cn/detail.jsp?callid=07051800104
http://12345.fuzhou.gov.cn/detail.jsp?callid=07052000053
http://12345.fuzhou.gov.cn/detail.jsp?callid=07052000012
http://12345.fuzhou.gov.cn/detail.jsp?callid=07052300116
http://12345.fuzhou.gov.cn/detail.jsp?callid=07052000015
http://12345.fuzhou.gov.cn/detail.jsp?callid=07052000015&code=905350
http://12345.fuzhou.gov.cn/detail.jsp?callid=07051600099

posted @ 2007-05-12 20:13 linghuye 阅读(880) | 评论 (0)编辑 收藏

粒子系统笔记

Particle systems model an object as a cloud of primitive particles that define its volumn.

1.New particles are generated into the system
2.each new particle is assigned its individual attributes
3.any particles that have existed within the system past their prescribed lifetime are extinguished
4.the remaining particles are moved and transformed according to their dynamic attributes and finally
5.an image of the living particles is rendered in a frame buffer.

The motions and transformations of particles could be tied to the solution of a system of partial differential equations, or particle attributes could be assigned on the basis of statictical machanics. We can, therefor, take advantage of models which have been developed in other scientific or engineering disciplines.

A particle system also has a generation shape which defines a region about its origin into which newly born particles are randomly placed. A sphere of radius r, a circle of radius r in the x-y plane of its coordinate system, and a rectangle of length l and width w in the x-y plane of its coordinate system.

The generation shape of particle system also describes the initial direction in which new particles move. In a spherical generation shape, particles move outward away from the origin of the particles system. In a circular or rectangular shape, particles move upward from the x-y plane, but are allowed to vary from the vertical according to an "ejection" angle, which is another parameter.

A particle system has a parameter that specifies the shape of each of the particles it generates.First we assume that particle systems do not intersect with other surface-based modeling primitives.
The other assumption is each particle can be displayed as a point light source. Each particle adds a bit of light to the pixels that it covers. A particle behind another particle is not obscured but rather adds more light to the pixels covered.

Reference:
Particle Systems - A Technique for modeling a class of fuzzy objects
http://www.gamasutra.com/features/20000623/vanderburg_01.htm

posted @ 2007-05-02 22:24 linghuye 阅读(1366) | 评论 (3)编辑 收藏

仅列出标题
共23页: First 2 3 4 5 6 7 8 9 10 Last