亮灯问题 Windows
Issues with light on Windows
我在使用 JOGL 的跨平台应用程序上遇到问题,我需要解决不同的问题,但 none 个都有效。
首先,这是一些代码,向您展示我如何渲染我的场景(没有对您无用的代码):
显示方式:
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 时,没有光渲染。
实际上,我做了一些测试,改变了光线的material,当我将物体靠近光线时,它的颜色会发生变化。所以光在这里,但它以相同的强度照亮所有地方。我的测试导致了 ATTENUATION 函数(setLighting 的最后一个树)。这个函数对 Windows 没有影响,或者它有但 Windows 在某个时候重置它,我不知道。
我很快就会在 Mac 上进行测试,所以我会编辑这个 post。
有人对此有想法吗?我不使用着色器是因为我没有时间学习,这是出于专业目的,但我知道总有一天我应该这样做。我真的找不到解决这个问题的方法,我在网上什么也没找到...
感谢大家阅读本文!
PS:这是我的第一个 post 和我的法语,如果我在论坛规则方面做错了什么,很抱歉,对于我最终糟糕的英语很抱歉 =)
编辑:
我刚刚在 Mac 上进行了测试,衰减工作正常。问题就在 Windows...
我在使用 JOGL 的跨平台应用程序上遇到问题,我需要解决不同的问题,但 none 个都有效。 首先,这是一些代码,向您展示我如何渲染我的场景(没有对您无用的代码):
显示方式:
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 时,没有光渲染。
实际上,我做了一些测试,改变了光线的material,当我将物体靠近光线时,它的颜色会发生变化。所以光在这里,但它以相同的强度照亮所有地方。我的测试导致了 ATTENUATION 函数(setLighting 的最后一个树)。这个函数对 Windows 没有影响,或者它有但 Windows 在某个时候重置它,我不知道。
我很快就会在 Mac 上进行测试,所以我会编辑这个 post。
有人对此有想法吗?我不使用着色器是因为我没有时间学习,这是出于专业目的,但我知道总有一天我应该这样做。我真的找不到解决这个问题的方法,我在网上什么也没找到...
感谢大家阅读本文!
PS:这是我的第一个 post 和我的法语,如果我在论坛规则方面做错了什么,很抱歉,对于我最终糟糕的英语很抱歉 =)
编辑: 我刚刚在 Mac 上进行了测试,衰减工作正常。问题就在 Windows...