Проблемы со светом на Windows

У меня проблема с кроссплатформенным приложением, использующим JOGL, и я решил разные вещи, но ни одна из них не сработала. Начнем с того, что это некоторый код, показывающий, как я отображаю свою сцену (без ненужного для вас кода):

Метод отображения:

public void display(GLAutoDrawable drawable) 
{ 
  // TODO Auto-generated method stub 
  GL2 gl = drawable.getGL().getGL2(); 

  setLighting(gl); 

  gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT ); 
  // matrice definition MODELVIEW from camera matrice 
  gl.glMatrixMode(GL2.GL_MODELVIEW);
  gl.glLoadMatrixf(this.camera.getCameraMatrix()); 
  gl.glDepthFunc(GL.GL_LEQUAL); 

  gl.glEnable(GL2.GL_NORMALIZE); 

  gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); 
  gl.glEnableClientState(GL2.GL_COLOR_ARRAY);

  /*** Voxels Drawing */ 
  gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo[0]); 
  gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0); 
  gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo[1]); 
  gl.glColorPointer(4, GL.GL_FLOAT, 0, 0); 
  gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo[2]); 

  gl.glEnable(GL.GL_BLEND); 
  gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 
  gl.glDrawElements(GL2.GL_QUADS, numberVertToDraw, GL.GL_UNSIGNED_INT, 0); 
  gl.glDisable(GL.GL_BLEND); 
  gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0); 
}

метод SetLighting:

private void setLighting(GL2 gl) 
{ 
   gl.glPushMatrix(); 
   gl.glLoadIdentity(); 
   float[] lightPos = new float[4]; 
   lightPos[0] = 15; 
   lightPos[1] = 25; 
   lightPos[2] = 15; 
   lightPos[3] = 1; 

   gl.glEnable(GL2.GL_LIGHTING); 
   gl.glEnable(GL2.GL_LIGHT0); 

   float[] noAmbient ={ 0.8f, 0.8f, 0.8f, 1f }; // low ambient light 
   float[] spec = { 0.8f, 0.8f, 0.8f, 1f }; // low ambient light 
   float[] diffuse ={ 0.2f, 0.2f, 0.2f, 1f }; 
   float[] rgba = {0f, 0f, 0f}; 
   gl.glMaterialfv(GL.GL_FRONT, GL2.GL_AMBIENT, rgba, 0); 
   gl.glMaterialfv(GL.GL_FRONT, GL2.GL_SPECULAR, rgba, 0); 
   gl.glMaterialf(GL.GL_FRONT, GL2.GL_SHININESS, 1f); 
   FloatBuffer Light1Dir = Buffers.newDirectFloatBuffer(new float[]{-1,-1,-1}); 
   FloatBuffer exponent = Buffers.newDirectFloatBuffer(new float[]{5}); // properties of the light 

   gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_AMBIENT, noAmbient, 0);
   gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPECULAR, spec, 0); 
   gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, diffuse, 0);
   gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, lightPos, 0); 
   gl.glLighti(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPOT_CUTOFF, 50); 
   gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPOT_DIRECTION, Light1Dir);
   gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPOT_EXPONENT, exponent); 

   gl.glLightf(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_CONSTANT_ATTENUATION, 1f); 
   gl.glLightf(GLLightingFunc.GL_LIGHT0,GLLightingFunc. GL_LINEAR_ATTENUATION, 0f);
   gl.glLightf(GLLightingFunc.GL_LIGHT0,GLLightingFunc. GL_QUADRATIC_ATTENUATION, 0f); 
   gl.glPopMatrix(); 
}

Итак, вот моя проблема: я экспортирую флягу, чтобы иметь кроссплатформенное приложение. Я тестирую на своей Linux-виртуальной машине, и в моей Linux-системе все работает как в моей IDE (Eclipse). Но когда я пробую на Windows, нет световой рендеринга.

На самом деле, я провел некоторый тест, меняя материал источника света, и когда я приближаюсь к объекту, его цвет меняется. Так что свет здесь, но он светит везде с одинаковой интенсивностью. Мои тесты приводят к функции ATTENUATION (дерево последнего из setLighting). Эта функция не влияет на Windows, или она имеет, но Windows в какой-то момент сбрасывает ее, я не знаю.

Я очень скоро протестирую на Mac, поэтому я буду редактировать этот пост.

У кого-то есть идея для этого? Я не использую шейдеры, потому что у меня нет времени учиться, это делается для профессиональных целей, но я знаю, что должен когда-нибудь. Я действительно не могу найти, как решить эту проблему, и я ничего не нашел в сети...

Спасибо всем за то, что прочитали это!

PS: это мой первый пост и мой французский, так что извините, если я сделал что-то не так в отношении правил форума, и извините за мой плохой английский =)

РЕДАКТИРОВАТЬ: Я только что сделал тест на Mac, и затухание работает так же, как оно должно работать. Проблемы только на Windows...

1 ответ

Решение

Это не имеет ничего общего с операционной системой. Пожалуйста, запустите простой пример OpenGL Red Book, портированного на JOGL, например, этот. Я предполагаю, что проблема связана с драйвером OpenGL.

Я советую вам прочитать это, как вы пытаетесь сделать толстый JAR.

У меня есть хотя бы одна старая видеокарта без подсветки, работающая должным образом под GNU Linux.

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

Другие вопросы по тегам