Opengl의 빛을 이해하려고 노력하면서 현실적인 태양 빛을 시뮬레이션하는 방법은 무엇입니까?


13

내가 잘못하거나 무언가를하고 있는지 모르겠지만 화창한 날처럼 햇빛을 시뮬레이트하고 싶습니다.

물체가 방향 조명을 향하면 조명이 밝고 아무런 문제가 없습니다. 물체 주위를 돌아 다니며 뒷면을 보면 어둡습니다. 내가 사용하고 있기 때문에 GL_AMBIENT너무 어둡지 않지만 화창한 날에는 여전히 너무 어둡습니다. 값을 늘리면 빛을 향한 물체의 측면이 너무 밝아지기 때문에 더 좋아 보이지 않습니다.

그리고 주변 광에 또 다른 성가신 문제가 있습니다. 물체 뒷면을 볼 때 어떤 모양도 볼 수 없으며 단색 만 보입니다. 설명하기 어려운, 여기 몇 가지 그림이 있습니다.

객체 전면 : http://i.stack.imgur.com/YW53X.png
객체 후면 : http://i.stack.imgur.com/Qufha.png

쉽게 볼 수 있듯이 앞면이 멋져 보입니다. 빨간색의 모양을 볼 수 있습니다. 뒷면에는 평범하며 같은 모양을 볼 수 없습니다.

이제 물체의 뒷면을보고 빛의 방향을보고 있으며 앞면보다 어두워 야합니다. 그러나 이렇게 평범하게 보이지 않아야합니다. 그것은 우리가 어떤 물체를 보면서 태양 빛에 대항 할 때 보이는 것이 아니며, 물체가 어떤 모양을 형성한다는 것을 알 수 있습니다.

OpenGL에 어떻게 같은 효과를 줄 수 있습니까?

내 조명은 현재 다음과 같이 정의되어 있습니다.

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);

가능하면 쉐이더 사용을 고려하는 것이 좋습니다. OpenGL 고정 함수 파이프 라인은 상당히 간단한 조명 모델을 사용하지만 셰이더는 수학을 완전히 제어 할 수 있습니다.
Incredulous Monk

답변:


11

주변 광을 사용하면 주변 광에 확산 광이 추가되고 기본적으로 확산 광이 1.0으로 설정되어 개체가 너무 밝게 나타납니다. 이는 최대 1.5가되며 1.0 이상의 모든 항목이 고정됩니다. 확산 광을 0.5로 설정하십시오.

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

두 번째 문제는 해결하기가 더 어렵습니다. 텍스처 또는 범프 맵과 같이 표면에 미세한 세부 사항을 추가 할 수 있습니다. OpenGL에서 앰비언트 라이트는 일정하지만 실제 세계에서는 그렇지 않습니다. 실제 세계를 시뮬레이션하려면 일부 형태의 전역 조명 솔루션이 필요합니다. 앰비언트 오 클루 전 은 여기서 많은 도움이되지만 OpenGL 상태를 설정하는 것보다 구현하기가 어렵습니다. 3D 모델링 소프트웨어에서 모델의 정점으로 앰비언트 오 클루 전을 굽거나 SSAO를 사용할 수 있지만 세부 사항은 다루지 않습니다.

쉽게 할 수있는 것은 다른 방향 (예 : 반대 방향)에서 다른 조광기 광원을 추가하는 것입니다. 이것은 현실적이지는 않지만 최소한 물체의 뒷면에도 약간의 모양을 부여합니다.

또한 응용 프로그램에 반사 하이라이트를 추가하는 것을 고려하십시오. 물체를 빛나게합니다.

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

특히 기본값이 적합하지 않은 경우 밝은 색상과 재료 색상을 별도로 지정할 수도 있습니다.


OpengGL에서 원하는 것을 할 수있는 간단하고 직접적인 방법은 없습니다 ... 너무 나쁩니다. 어쩌면 다른 광원을 추가하려고 시도 할 수도 있지만 정확히 어떻게 광 강도를 지정합니까?
rfgamaral

GL_SPECULARGL_SHININESS나는 변화를 못했지만 ... 어떤 효과를하지 않는 것 glMaterialfvglMateriali는 컴파일되지 않았기 때문에. 그리고 128과 같은 더 큰 값을 시도했습니다. 그것은 나에게 똑같아 보입니다. 아마도 문제는 내로드 된 모델 (obj / mtl)에있을 것입니다.
rfgamaral

1
@Nazgulled 방금 light0 specular의 기본값이 1.0이고 material specular의 기본값이 0.0인지 확인했습니다. 따라서 glLightfv (GL_LIGHT0, GL_SPECULAR, specLight0)를 변경하십시오. glMaterialfv (GL_FRONT, GL_SPECULAR, specLight0); glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE)를 설정하는 것도 좋습니다. 또는 카메라가 회전 할 때 스페 큘러가 잘못 계산 될 수 있습니다.
msell

1
@Nazgulled 보조 라이트의 경우 주변 및 스페 큘러를 0으로 설정하고 확산에 대해 0.2와 같은 작은 값을 설정하십시오. 모든 조명의 분위기를 0으로 설정하고 GL_LIGHT_MODEL_AMBIENT와 함께 전역 분위기를 사용할 수도 있습니다.
msell

2

OpenGL의 주변 광은 단색이지만 실제 환경의 주변 광은 일반적으로 위보다 밝고 아래에서 어둡습니다. 주변 광을 매우 진한 파란색으로 설정하고 아래쪽을 가리키는 진한 파란색 방향성 조명을 추가하여 OpenGL에서이를 근사 할 수 있습니다. 즉, 태양이 어디에서나 나오는 밝은 백색 방향성 조명은 실외 조명과 거의 비슷합니다.

실제로해야 할 일은 픽셀 당 빛을 계산하는 셰이더를 작성하는 것입니다. 그러나 어디에서 도착하든 약간의 시간이 걸립니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.