问题描述
当我在 opengl 中为对象设置材质时 (glutSolidSphere(2.,10.,8.);),例如祖母绿参数:
float[] mat_ambient ={ 0.0215f,0.1745f,0.0215f,0.55f };
float[] mat_diffuse ={0.07568f,0.61424f,0.07568f,0.55f };
float[] mat_specular ={0.633f,0.727811f,0.633f,0.55f };
float shine = 76.8f;
为了获得真正的祖母绿物体,我应该以相同的方式设置光的成分吗?我的意思是:
float[] light_ambient ={ 0.0215f,0.55f };
float[] light_diffuse ={0.07568f,0.55f };
float[] light_specular ={0.633f,0.55f };
float[] light_position= { 1.0,1.0,0.0 };
结果并不好...
解决方法
如果您想用 Blinn–Phong reflection model 和 Gouraud shading 渲染绿色表面,您已经找到了答案。但是,您无法使用 20 年历史的 OpenGL 固定功能管道做任何更现实的事情。与您之前问题 How can I do a brass surface? 的评论中的原因相同。
使用 Gouraud 着色,光照模型是按顶点计算的,而 Phong shadding 是按片段计算的。在球体上使用更高的分辨率来改善照明并获得一些镜面高光。请参阅 GLSL fixed function fragment program replacement 和 What's the difference between Phong shading and Gouraud shading?。