Windows上的问题

时间:2015-07-23 11:19:22

标签: cross-platform jogl light

我在使用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(); 
}

所以这是我的问题:我导出jar以获得跨平台应用程序。我在我的Linux VM上测试,在我的Linux系统上,所有的工作都在我的IDE(Eclipse)中。但是当我在Windows上尝试时,没有光渲染。

实际上,我做了一些测试来改变光线的材质,当我将物体接近光线时,它的颜色会发生变化。所以光线在这里,但它以相同的强度照亮每个地方。我的测试导致了ATTENUATION函数(setLighting的树的最后一个)。这个功能对Windows没有影响,或者它有Windows但在某些时候重置它,我不知道。

我很快就会在Mac上测试,所以我会编辑这篇文章。

有人对此有所了解吗?我没有使用着色器,因为我没有时间学习,这是出于专业目的,但我知道有一天我应该这样做。我真的无法找到如何解决这个问题,我在网上什么都没找到......

感谢大家阅读本文!

PS:这是我的第一篇文章和我的法语,很抱歉,如果我对论坛规则做错了,对不起我最后的英语不好=)

修改 我刚刚在Mac上进行了测试,衰减就像它应该工作一样。问题只出现在Windows上......

1 个答案:

答案 0 :(得分:0)

它与操作系统无关。请运行一个移植到JOGL的OpenGL Red Book的简单示例,例如this one。我假设问题来自OpenGL驱动程序。

我建议你在尝试制作一个胖JAR时阅读this

我在GNU Linux下至少有一张没有正常工作的旧显卡。

请将您的第一行评论翻译成英文,请考虑绝大多数不了解我们母语的StackOverflow用户。