0

对于 OpenGL 项目的照明部分,我目前正在为我的团队做这部分:

在第 1 部分中为模型定义材料属性。使您的材料定义易于替换。具体来说,机器人组件和遥控单元应该是“闪亮的”;各种颜色深浅的​​碎石堆应化解;主平台瓷砖应该是漫反射灰色。选择您自己的材料属性并为块、基地、工厂等正确记录它们。

我只是尝试在控制单元上应用“闪亮”效果,但效果不佳。我尝试放入一些示例照明,因为我们还没有放入任何(或者至少它不在存储库中)来测试它。结果是控制器的立方体部分反射了(虽然太白了,不管我尝试了什么,立方体的颜色都是灰色的),但圆柱体天线没有反射。(这些测试都不在存储库中,因为我无法提交不起作用的东西。)

基本上我需要关于材料属性和设置一些基本照明来测试它们的帮助(测试照明是暂时的,因为我的一个队友正在研究照明)。

如果有人可以帮助我完成这部分工作,我将不胜感激。

项目信息:

  • 我们项目的存储库(Visual Studio 2010 项目)
  • 地图/网格位于 xz 平面上,y 为高度
  • 一切都是使用 glCubes 或 glut 形状完成的,因此不需要为它们定义法线,只有一些瓷砖和到处的数字 4 是使用 gl_quads 完成的

如果我错过了任何内容或您需要更多信息,请询问!

4

1 回答 1

2

我将帮助您了解 OpenGL 中闪电的基础知识...首先您需要启用和设置您的灯光,所以,这里有一些示例:

    void setlight(){
            //here you set the lights and parameters, example with one light
            float LightAmbient[] = { 0.1f, 0.1f, 0.05f, 1.0f };
            float LightEmission[] = { 1.0f, 1.0f, 0.8f, 1.0f };
            float LightDiffuse[] = { 1.0f, 1.0f, 0.8f, 1.0f };
            float LightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
            float LightDirection[]={-0.5f, -0.5f, -0.5f};
            glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
            glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
            glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
            glLightfv(GL_LIGHT0, GL_POSITION, LightDirection);
            glEnable(GL_LIGHTING);
            glEnable(GL_LIGHT0);
    }
    void setmaterial(){
            //here you set materials, you must declare each one of the colors global or locally like this:
            float MatAmbient[] = { 0.1f, 0.1f, 0.1f, 1.0f };
            float MatDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
            float MatSpecular[] = { 0.1f, 0.1f, 0.0f, 0.1f };
            float MatShininess = 60;
            float black[] = {0.0f,0.0f,0.0f,1.0f};
            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, MatAmbient);
            glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MatDiffuse);
            glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, MatSpecular);
            glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, MatShininess);
            glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black);
    }
    void render(){
            //your render function
            //clean buffers, set viewport, projection, lookat, etc...
            . . .

            //set light and materials
            setlight();
            setmaterial();

            //draw your stuff

            . . .

            glutSwapBuffers();
    }

现在,如果您需要为不同的对象设置不同的材质来绘制,您必须在绘制它们之前为每个对象设置材质......例如:

    for(int i=0; i<num_objetcs; i++){
            setmaterial(i);
            drawobject(i);
    }

当然,你必须修改我之前写的……你只需要设置灯光,然后为每个对象设置它们的材质,然后一个一个地绘制。您必须修改“setmaterial”函数以获取材料参数,我想您知道其余部分该怎么做......祝你好运!

于 2012-02-27T23:49:37.867 回答