OpenGL(java)更新灯?

时间:2012-12-29 17:28:23

标签: java opengl lwjgl

我目前正在使用lwjgl学习OpenGL。 我创建了一个由顶点构建的Box。我还创建了一个灯光类,应该设置灯光的参数,最后启用灯光。

我可以轻松工作,但有一个问题。如果我围绕任何轴旋转Box,则灯不会更新盒子的表面。这意味着:

如果我的灯在我的盒子前面......我的盒子前面是白色的,盒子的背面是黑色的。如果我将我的盒子旋转180°左右,我的新前侧应该是白色的,我的旧前侧(现在是背面)应该是黑色的。但它不是!为什么?每次我再次渲染场景时,是否需要创建灯光?

这是我创建灯光的代码:

//creating buffers
    FloatBuffer matSpecular = BufferUtils.createFloatBuffer(4);
    matSpecular.put(1.0f).put(1.0f).put(1.0f).put(1.0f).flip(); 

    FloatBuffer lightPosition = BufferUtils.createFloatBuffer(4);
    lightPosition.put(1.0f).put(1.0f).put(1.0f).put(0.0f).flip();   

    FloatBuffer whiteLight = BufferUtils.createFloatBuffer(4);
    whiteLight.put(1.0f).put(1.0f).put(1.0f).put(1.0f).flip();  

    FloatBuffer lModelAmbient = BufferUtils.createFloatBuffer(4);
    lModelAmbient.put(0.5f).put(0.5f).put(0.5f).put(1.0f).flip();

    //-----------------

    GL11.glShadeModel(GL11.GL_SMOOTH);
    GL11.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, matSpecular);
    GL11.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 50.0f);

    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, lightPosition);
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, whiteLight);
    GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, whiteLight);
    GL11.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, lModelAmbient);

    GL11.glEnable(GL11.GL_LIGHTING);
    GL11.glEnable(GL11.GL_LIGHT0);

    GL11.glEnable(GL11.GL_COLOR_MATERIAL);
    GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE);

这就是我创建绘制框的方式:

GL11.glPushMatrix();

    GL11.glLoadIdentity();
    GL11.glTranslatef(_position.x, _position.y, _position.z);
    GL11.glRotatef(_rotation, 0, 0, 1);
    GL11.glRotatef(_rotation, 0, 1, 0);

    GL11.glColor3f(1f, 1f, 1f);

    GL11.glBegin(GL11.GL_TRIANGLES);

    for(int index : cubeIndices)
    {
        Vector3f vertex = _vertices[index];
        GL11.glVertex3f(vertex.x, vertex.y, vertex.z);
    }

    GL11.glEnd();

    GL11.glPopMatrix();

0 个答案:

没有答案