Opengl의 빛을 이해하려고 노력하면서 현실적인 태양 빛을 시뮬레이션하는 방법은 무엇입니까? 잘못하거나 무언가를하고 있는지 모르겠지만 화창한

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

물체가 방향 조명을 향하면 조명이 밝고 아무런 문제가 없습니다. 물체 주위를 돌아 다니며 뒷면을 보면 어둡습니다. 내가 사용하고 있기 때문에 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);


답변

주변 광을 사용하면 주변 광에 확산 광이 추가되고 기본적으로 확산 광이 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

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


답변

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

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


답변

당신이 여기에 대한 답변은 꽤 좋습니다. 하나만 추가하면됩니다. 더 좋게 만들고 싶다면 대기 산란을 구현하십시오.