2013-11-27 4 views
1

내 프로그램에서 조명과 반사를 올바르게 얻으려고합니다. 저는 마우스를 움직일 수있는 큰 구체를 가지고 있습니다. 마우스는 광원 (LIGHT0)이어야하고 주위를 반사하는 작은 구체는 빛을 반사해야합니다. 제가JOGL 올바른 빛과 구체의 반사

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와 방향성 광을 생성

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} 

처음 [0 : I는 I 키보드를 I 정의

제 어떤 색을 사용하여 방향을 바꿀 수있는 집광 필요 , 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)을 움직일 때 나는 어떤 차이도 볼 수 없습니다. 나는 큐브, 큰 구체, 작은 구체 또는 뒤의 그림의 선상에 반사를 보지 못합니다. 아래는 내 프로그램의 스크린 샷입니다. 내 구체가 빛나지 않게 만들고, 큰 빛의 방향성 빛과 빛을 모두 반영하려면 어떻게해야합니까? 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다. 당신이 불이 있음을 의미합니까 빛을 반사하여

My program

답변

0

? 반사는 광선 추적을 수반하며 훨씬 더 큰 문제입니다.

저는 JOGL에 대한 직접적인 경험이 없지만 jME3을 상당히 많이 사용했습니다. 이러한 종류의 문제는 일반적으로 꺼져있는 재질을 사용하여 발생합니다 (이 경우에는 물체의 불규칙한 법선에 의한 것, 또는 단순히 주위의 빛 및/또는 물질의 주위색을 너무 높게 설정하는 것 등이 있습니다.

1

작은 구체를 추적 할 때 번개가 비활성화 된 것처럼 보입니다. drawSphere라고 부르는 코드는 보이지 않지만 실제로 GL_LIGHTING이 설정된 Big 영역과 GL_LIGHTING이 비활성 인 작은 영역을 추적하는 것처럼 보입니다.

0

정상적으로 법선을 올바르게 설정하지 않는다고 말할 수 있습니다. 법선은 기본적으로 빛을 반사시키고 자하는 방향을 가리켜 야합니다. 삼각형에서 일반적으로 "90 ° 떨어져"있습니다 (교차 제품 사용). 그런 다음 OpenGL은 해당 법선을 사용하여 표면에 반영된 실제 조명을 계산합니다. 자세한 설명은 this tutorial을 참조하십시오.

다른 문제는 오래된 OpenGL 2를 사용한다는 것입니다.0 기능을 사용하여 꼭지점 기반 조명을 사용하므로 구체의 각 삼각형이 효과적으로 동일한 값으로 밝아집니다. 구면에 픽셀이있는 정점 수가 많지 않으면 구형 기능을 사용하여 거의 불가능한 픽셀 단위의 조명을 찾고 있다면 코드를 업데이트하고 쉐이더를 사용해야합니다.

This tutorial은 Java가 아니지만 최신 OpenGL의 기본 사항을 잘 설명하며 JOGL로 쉽게 번역 할 수 있어야합니다.