2015-03-08 5 views
0

Я пытаюсь сделать два метода для создания куба. Дело в том, что если я рисую куб вручную, освещение не отображается. Я новичок, так что это может быть тривиально, но я в недоумении. Что показывает в моем окне это:Освещение OpenGL, не действующее на некоторые фигуры

enter image description here

Куб, который делает шоу оттенков является один я сделал с GLUT, другие два я сделал вручную рисуя каждое лицо. Вот мой метод отображения: (., Так как это, как предполагается, будет масштабироваться, текстурированные, и стать частью стены ... в случае, если Вы задавались вопросом)

public void display(GLAutoDrawable glautodrawable) { 
      GL2 gl2 = glautodrawable.getGL().getGL2(); 
      gl2.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
      gl2.glMatrixMode(GL2.GL_MODELVIEW); 
       //    gl2.glLoadIdentity(); 
      gl2.glPushMatrix(); 

      gl2.glTranslatef(2f, -2f, -4f); 
      gl2.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_AMBIENT, FloatBuffer.wrap(QA_WHITE)); 
      gl2.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE, FloatBuffer.wrap(QA_WHITE)); 
      gl2.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_SPECULAR, FloatBuffer.wrap(QA_WHITE)); 
      gl2.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_SHININESS, FloatBuffer.wrap(new float[]{50f})); 

      wallUnit(glautodrawable); 
      gl2.glPopMatrix(); 

      gl2.glPushMatrix(); 
      gl2.glTranslatef(-2f, -2f, -10f); 
      wallUnit(glautodrawable); 
      gl2.glPopMatrix(); 

      gl2.glPushMatrix(); 
      gl2.glTranslatef(-4.5f, -2.5f, -10f); 
      glut.glutSolidCube(2f); 
      gl2.glPopMatrix(); 


      gl2.glFlush(); 

     } 

И мой wallUnit() метод

private static void wallUnit(GLAutoDrawable glAutoDrawable) { 
    GL2 gl2 = glAutoDrawable.getGL().getGL2(); 

    gl2.glBegin(gl2.GL_QUADS);  

    // Back face 
    gl2.glColor3f(1,0,0); 
    gl2.glVertex3f(-1.0f, -1.0f, -1.0f);    
    gl2.glVertex3f(1.0f, -1.0f, -1.0f);   
    gl2.glVertex3f(1.0f, 1f, -1.0f); 
    gl2.glVertex3f(-1.0f, 1f, -1.0f);   

    // Bottom face 
    gl2.glColor3f(0,1,0); 
    gl2.glVertex3f(-1.0f, -1.0f, -1.0f); 
    gl2.glVertex3f(1.0f, -1.0f, -1.0f); 
    gl2.glVertex3f(1.0f, -1.0f, 1.0f);  
    gl2.glVertex3f(-1.0f, -1.0f, 1.0f);   

    // Right side 
    gl2.glVertex3f(1.0f, -1.0f, -1.0f);   
    gl2.glVertex3f(1.0f, -1.0f, 1.0f);    
    gl2.glVertex3f(1.0f, 1.0f, 1.0f);   
    gl2.glVertex3f(1.0f, 1f, -1.0f);   

    // Top face 
    gl2.glVertex3f(1.0f, 1.0f, 1.0f);   
    gl2.glVertex3f(1.0f, 1f, -1.0f);   
    gl2.glVertex3f(-1.0f, 1f, -1.0f);   
    gl2.glVertex3f(-1.0f, 1f, 1.0f);   

    // Left side 
    gl2.glVertex3f(-1.0f, -1.0f, -1.0f);   
    gl2.glVertex3f(-1.0f, -1.0f, 1.0f);   
    gl2.glVertex3f(-1.0f, 1.0f, 1.0f);   
    gl2.glVertex3f(-1.0f, 1f, -1.0f);   

    // Front face 
    gl2.glColor3f(1,0,0); 
    gl2.glVertex3f(-1.0f, -1.0f, 1.0f);   
    gl2.glVertex3f(1.0f, -1.0f, 1.0f);   
    gl2.glVertex3f(1.0f, 1f, 1.0f);   
    gl2.glVertex3f(-1.0f, 1f, 1.0f);   

    gl2.glEnd(); 
} 

ответ

1

Вы должны генерировать нормали для квадрациклов:

gl2.glBegin(gl2.GL_QUADS);  

// Back face 
gl2.glColor3f(1,0,0); 
gl2.glNormal3f(1.0f, 0.0f, 0.0f); // quad normal 
gl2.glVertex3f(-1.0f, -1.0f, -1.0f);    
gl2.glVertex3f(1.0f, -1.0f, -1.0f);   
gl2.glVertex3f(1.0f, 1f, -1.0f); 
gl2.glVertex3f(-1.0f, 1f, -1.0f); 

... 
+0

Awesome, работает как шарм. Благодаря! – Snowflake

1

Прошло много времени с тех пор, как я занялся openGL. Я думаю, вам нужно определить нормали для каждой стороны ваших кубов.

OpenGL поддерживает фиксированное количество огней. Доступное количество зависит от реализации, но всегда будет как минимум 3. Перейдите в строку после glEnable (GL_CULL_FACE); и добавьте следующее:

// Включить освещение nullglEnable (GL_LIGHTING); nullglEnable (GL_LIGHT0);

Когда вы скомпилируете, вы обнаружите, что на самом деле это ничего не значит. Свет включен, но он еще не используется. Причина в том, что OpenGL должен знать «нормальный» для каждой вершины, которую он освещает. OpenGL выполняет вычисления освещения в вершинах только по соображениям эффективности.

https://www.cse.msu.edu/~cse872/tutorial3.html

Например. Нормальный (т. Е. Вектор, перпендикулярный плоскости) для задней плоскости, равен < 0, 0, -1>.

// Back face 
gl2.glColor3f(1,0,0); 
gl2.glNormal3f(0.0f, 0.0f, -1.0f); 
gl2.glVertex3f(-1.0f, -1.0f, -1.0f); 
gl2.glVertex3f(1.0f, -1.0f, -1.0f); 
gl2.glVertex3f(1.0f, 1f, -1.0f); 
gl2.glVertex3f(-1.0f, 1f, -1.0f); 

Повторите для других сторон.