您的位置:首页 > 其它

龙书colorTriangle例子小节

2011-07-20 15:17 169 查看
龙书开始例子能看到窗体内有个红色三角形的时候,书中教我们定义了一个这样的灵活顶点结构:
struct ColorVertex{
float x, y, z;
D3DCOLOR color;
static const DWORD FVF;
}
const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;diffuse为何物不就是漫反射的意思嘛,为啥能代表颜色?
龙书第五章开头说到了,使用光照时,我们无需自行指定顶点的颜色值;Direct3D会将顶点送入光照计算引擎(light engine),依据光源类型、材质(material)以及物体表面相对于光源的朝向,计算出每个顶点的颜色值。
那么颜色那张我们自己填写的D3DFVF_DIFFUSE原来是光照自己计算的,不管是我们自己指定还是光照引擎去计算,最终出来这个diffuse是做什么的?为啥决定了最终三角形的颜色?
cg tutorial说了。。p93 基本的光照模型
OpenGL和Direct3D提供了几乎相同的固定功能光照模型。在这里我们使用一个简化的版本,我们称之为“基本”模型。这个基本模型和OpenGL和Direct3D模型一样,对经典的Phone模型进行了修改和扩展。在基本模型里,一个物体的表面颜色是放射、环境放射、漫反射和镜面反射等光照作用的总和。每种光照作用取决于表面材质的性质和光源的性质的共同作用。从数学上描述基本模型的高级公式如下所示:
surfaceColor = emissive + ambient + diffuse + specular

这里可以大概了解了。关闭光照后,最终颜色颜色还是这个公式的吧,只是参数是手动指定了。
但是有点疑惑。。干嘛不用其他的光代表?比如D3DFVF_SPECULAR。。我也改了下例子,将D3DFVF_DIFFUSE换成这个镜反射,但是三角形不见了。。难道是上面yy的错了吗?对了,surfaceColor 就这个定了吗?那纹理取出的颜色咋办?

//高手帮忙解答下吧。下面是搜到的百度解答。。
opengl 中 光照纹理如何同时存在
浏览次数:71次悬赏分:10 | 提问时间:2011-6-8 20:19 | 提问者:︷゛惡作劇o 问题补充:
还有物体自发光怎么实现呀?


其他回答 共1条
在一般状态下,当把一个纹理应用于一个片断时,只有主颜色与纹理单元的颜色进行了组合.主颜色可能是光照计算的结果,也可能是通过glColor*()函数指定的值.
在纹理处理之后,但在进行雾计算之前,可以对片断应用一种辅助颜色.辅助颜色的应用可以使经过纹理贴图的物体具有更真实的高光效果.
---禁用光照时
如果当前并没有启用光照,并且启用了颜色求和模式(使用glEnable(GL_COLOR_SUM)),那么当前的辅助颜色(由glSecondaryColor*()所设置)便被加到经过纹理处理后的片断颜色上.
---启用光照后
纹理操作是在光照之后进行的,但把镜面亮点和纹理的颜色进行混合通常会减弱光照的效果. 可以为每个顶点计算两种颜色:一种是主颜色,由所有的非镜面成分组成,另一种是辅助颜色,由所有的镜面成分组成.如果把镜面颜色分离来,辅助(镜面)颜色就会在纹理计算之后再添加到片断中.
如果当前启用了光照,就会应用辅助镜面颜色,而不管是否为GL_COLOR_SUM模式,并且glSecondaryColor*所设置的任何辅助颜色都会被忽略.
---------------------
分离镜面成分
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);//后面参数用GL_SINGLE_COLOR恢复默认值

_____________
问题补充:
发射光在材料属性里设置
通过为GL_EMISSION参数指定一个RGBA颜色值,可以使物体看上去发射出这种颜色的光.
由于绝大多数现实世界的物体(除了光源之外)自己都不会发光,因此我们很可能只有在模拟场景中的台灯和其他光源时才会使用这个特性.
GLfloat mat_emission[]={0.3, 0.2, 0.2, 0.0};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
虽然看上去微微有些发光,但是,他们实际上并不是作为光源.需要创建一个光源,放在和物体相同的位置,以创建这种效果
参考资料:《OpenGL编程指南》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: