2015-07-23 10 views
0

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

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

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: Это мой первый пост, и мой французский, так что извините, если я сделал что-то неправильно в отношении правил форума, и простите за мой в конечном итоге плохой английский =)

EDIT: Я только что сделал тест на Mac, и затухание работает так же, как должно работать. Проблемы только на Windows ...

ответ

0

Это не имеет никакого отношения к операционной системе. Простой пример Красной книги OpenGL, перенесенной в JOGL, например this one. Я предполагаю, что проблема связана с драйвером OpenGL.

Советую вам прочитать this, пытаясь сделать толстый JAR.

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

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

+0

О да, я не видел эту линию, извините! Действительно, я попробовал банку в других окнах, и у меня не было проблем, это должно произойти от моего водителя. Спасибо за ссылки, я посмотрю на это. – AlEmerich