【问题标题】:JOGL correct light and reflection in spheresJOGL 校正球体中的光线和反射
【发布时间】:2013-11-27 23:06:56
【问题描述】:

我正在尝试让程序中的灯光和反射正确。我有一个大球体,我可以移动鼠标,它应该是一个光源(LIGHT0),而较小的球体在它周围弹跳应该反射光线。我还需要一个可以使用键盘改变方向的定向灯

首先我定义了一些颜色:

float whitish[] = {0.8f, 0.8f, 0.8f, 1};
float white[] = {1, 1, 1, 1};
float blackish[] = {0.2f, 0.2f, 0.2f, 1};
float black[] = {0, 0, 0, 1}

我用

创建定向光
gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, blackish,0);
gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, white,0);
gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, white,0);
gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, spot_position,0); 

spot_position 最初是 [ 0, 0, 1, 0] 但它可以通过按下键盘键来改变。一次按键将 0.05 添加到位置矢量的特定分量,直到它达到 1,然后它重置回 -1(没什么花哨的)。

中心球体的光是:

gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, position,0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, blackish,0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, white,0);
gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, white,0);

这盏灯的位置总是在我的大透明球体的中心。位置向量的w分量为1。

我有这段代码可以在后面画图

gl.glBegin(GL_QUADS);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, white,0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, white,0);
gl.glMaterialfv(GL.GL_FRONT, GL.GL_SHININESS, white,0);
// Back Face
gl.glNormal3f(0, 0, 1);
gl.glTexCoord2f(texRight, texBottom);
gl.glVertex3f(rx2, ry1, rz1);
gl.glTexCoord2f(texRight, texTop);
gl.glVertex3f(rx2, ry2, rz1);
gl.glTexCoord2f(texLeft, texTop);
gl.glVertex3f(rx1, ry2, rz1);
gl.glTexCoord2f(texLeft, texBottom);
gl.glVertex3f(rx1, ry1, rz1);

为了绘制球体,我使用以下函数:

public void drawtriangle(float[] v1, float[] v2, float[] v3) {
    gl.glBegin(GL.GL_TRIANGLES);
    gl.glNormal3fv(v1, 0);
    gl.glVertex3fv(v1, 0);
    gl.glNormal3fv(v2, 0);
    gl.glVertex3fv(v2, 0);
    gl.glNormal3fv(v3, 0);
    gl.glVertex3fv(v3, 0);
    gl.glEnd();
}

private void subdivideSphere2(float v1[], float v2[], float v3[], long depth) {
   float v12[] = new float[3];
   float v23[] = new float[3];
   float v31[] = new float[3];
    int i;

    if (depth==0) {
    float[] color= {v1[0]*v1[0], v2[1]*v2[1], v3[2]*v3[2], alpha};
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, blackish,0);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, color,0);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, color,0);
    gl.glMaterialfv(GL.GL_FRONT, GL.GL_SHININESS, color,0);
      drawtriangle(v1, v2, v3);
      return;
    }
   for (i = 0; i<3; i++) {
       v12[i] = v1[i]+v2[i];
       v23[i] = v2[i]+v3[i];
       v31[i] = v3[i]+v1[i];
    }
    normalize(v12);
    normalize(v23);
    normalize(v31);
    subdivideSphere2(v1, v12, v31, depth-1);
    subdivideSphere2(v2, v23, v12, depth-1);
    subdivideSphere2(v3, v31, v23, depth-1);
    subdivideSphere2(v12, v23, v31, depth-1);
}


public void drawSphere() {
    subdivideSphere2(sVdata[0], sVdata[1], sVdata[2], depth);
    subdivideSphere2(sVdata[0], sVdata[2], sVdata[4], depth);
    subdivideSphere2(sVdata[0], sVdata[4], sVdata[5], depth);
    subdivideSphere2(sVdata[0], sVdata[5], sVdata[1], depth);

    subdivideSphere2(sVdata[3], sVdata[1], sVdata[5], depth);
    subdivideSphere2(sVdata[3], sVdata[5], sVdata[4], depth);
    subdivideSphere2(sVdata[3], sVdata[4], sVdata[2], depth);
    subdivideSphere2(sVdata[3], sVdata[2], sVdata[1], depth);
 }  

我的问题是,小球体根本不反射光。他们一直都很明亮。当我将大球体移近它们时,我可以看到立方体的绿线反射了一点光,但对球体完全没有影响。此外,当我移动定向光 (LIGHT1) 时,我看不到任何区别。我没有看到立方体的线条、大球体、小球体或背面的图片有任何反射。下面是我的程序的截图。如何使我的球体不发光,并反射定向光和大球体的光?任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java windows opengl graphics jogl


    【解决方案1】:

    在追踪您的小球体时,闪电似乎被禁用了。我没有看到您调用 drawSphere 的代码,但看起来您正在跟踪启用 GL_LIGHTING 的大球体和禁用 GL_LIGHTING 的小球体。

    【讨论】:

      【解决方案2】:

      你所说的反射光是指它被照亮了吗?反射涉及光线追踪,是一个更大的主题。

      我没有直接使用 JOGL 的经验,但我已经大量使用了 jME3,这种问题通常是由使用不发光的材料引起的(正如你所说的,这里似乎不是这种情况它被点亮了一点),由于物体的法线不好,或者只是将环境光和/或材质的环境颜色调得太高。

      【讨论】:

        【解决方案3】:

        据我所知,您没有正确设置法线。法线基本上应该指向您想要将光线反射到的方向,该方向通常与三角形“90°”(使用叉积)。然后,OpenGL 将使用该法线来计算表面反射的实际光照。更多解释见this tutorial

        另一个问题是您使用了过时的 OpenGL 2.0 功能,该功能执行基于顶点的照明,因此球体中的每个三角形都被有效地照亮为相同的值。如果您正在寻找逐像素照明,使用过时的功能几乎不可能实现,除非球体的顶点数与屏幕上的像素数一样多,您需要更新代码并使用着色器。

        This tutorial 不是 Java,但它很好地解释了现代 OpenGL 的基础知识,并且应该很容易翻译成 JOGL。

        【讨论】:

          猜你喜欢
          • 2018-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-26
          • 1970-01-01
          相关资源
          最近更新 更多