OpenGL照明

时间:2014-04-23 14:03:59

标签: c++ opengl lighting

我有一个opengl照明问题,我有一个对象让我们说这个。

enter image description here

它是一个没有应用光效的原始物体,所以问题是当我尝试为这个物体添加光时它会隐藏物体颜色并将物体变成这种颜色

enter image description here

我使用的漫反射和镜面反射分量:

GLfloat diffu[] = {0.5f, 0.5f, 0.5f, 1.0f};
GLfloat spec[] = {0.5f, 0.5f, 0.5f, 0.5f};
GLfloat shinnes [] = {50};
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffu);
glLightfv(GL_LIGHT1, GL_SPECULAR, spec);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,shinnes);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);

所以我需要了解问题是什么?

3 个答案:

答案 0 :(得分:3)

从此(http://www.glprogramming.com/red/chapter05.html)链接:

  

为场景中的对象定义材质属性

     

对象的材质属性决定了它如何反射光线   因此它似乎是由什么材料制成的。因为   物体的材料表面和入射光之间的相互作用是   复杂,指定材质属性,以便对象具有   某些所需的外观是一门艺术。您可以指定材料   环境,漫反射和镜面反射颜色以及它的闪亮程度。在这   例如,只有最后两个材质属性 - 镜面反射   材料颜色和光泽 - 明确指定(使用   glMaterialfv()调用)。 (有关a,请参阅“定义材料属性”)   所有材料属性参数的描述和示例。)

一旦开始使用光照,对象材质属性(其颜色)由glMaterialfv()传入的高光/漫反射...属性指定。因此,如果您使用glColor(),则需要使用glMaterialfv()指定材质属性。

在您的代码中,以及设置光源镜面和漫反射颜色,您需要设置材质镜面反射和漫反射颜色:

// Set light properties
GLfloat diffu[] = {0.5f, 0.5f, 0.5f, 1.0f};
GLfloat spec[] = {0.5f, 0.5f, 0.5f, 0.5f};
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffu);
glLightfv(GL_LIGHT1, GL_SPECULAR, spec);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);

// Set material properties
GLfloat shinnes [] = {50};
GLfloat matdiffu[] = {1.0f, 0.f, 0.f, 1.0f};
GLfloat matspec[] = {1.0f, 0.f, 0.f, 1.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,matdiffu);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,matspec);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,shinnes);

// Draw object

答案 1 :(得分:1)

diffu和spec也定义了材质的颜色;使用{0f, 1f, 0f, 1f}{0f, 1f, 0f, 0.5f}获得纯蓝色(假设为RGBA)

答案 2 :(得分:1)

glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuseColor);

与GL_SHININESS,GL_SPECULAR一起设置几何体的材质属性。然后,灯光将与几何材料正确交互。