4장에서 보았듯이 OpenGL은 프레임 버퍼에 있는 최종 표시된 장면에서 각 픽셀의 색상을 계산합니다. 이 계산의 일부는 장면에서 사용되는 조명과 장면의 오브젝트가 해당 라이트를 반사하거나 흡수하는 방법에 따라 달라집니다. 예를 들어, 바다는 회색, 흐린 날에보다 밝고 화창한 날에 다른 색상을 가지고 있음을 기억하십시오. 햇빛이나 구름의 존재는 바다를 밝은 청록색으로 볼 것인지 어두운 회색 – 녹색으로 볼 것인지를 결정합니다. 사실, 대부분의 오브젝트는 불이 켜질 때까지 3차원으로 보이지 않습니다. 그림 5-1은 동일한 장면(단일 구)의 두 가지 버전을 보여 주며, 하나는 조명이 있고 하나는 없는 장면입니다. 이 예제에서 RGBA 색상(0.1, 0.5, 0.8, 1.0)은 진한 파란색으로 전면 및 후면 다각형 모두에 대한 현재 주변 및 확산 반사를 나타냅니다. 대부분의 서피스에는 스페큘러 및 확산 구성요소가 모두 있습니다. 자동차의 외부 표면이 좋은 예입니다. 완벽한 거울은 아니지만 반사를 볼 수 있을 만큼 충분히 빛납니다. 표면에 는 투명 한 탑 코트 의 층 아래에 페인트 층이 있기 때문입니다. 페인트 레이어는 분산되지만 탑코트 레이어는 스페큘러입니다. 탑코트도 선명하기 때문에 일부 빛이 반사되지만 일부 빛은 곧바로 통과하여 아래 페인트 층을 강타합니다.

빛을 이동하는 이 방법은 광부의 모자에서 조명을 시뮬레이션하는 데 매우 유용할 수 있습니다. 또 다른 예는 촛불이나 랜턴을 들고 있을 것입니다. glLightfv(GL_LIGHTi, GL_POSITION, 위치)에 대한 호출에서 지정한 라이트 위치는 눈 위치에서 조명 소스까지의 x, y 및 z 거리입니다. 그런 다음 눈 위치가 이동하면 라이트는 상대거리가 동일하게 유지됩니다. 이 문서의 코드는 소스/07_more_lighting 폴더에서 찾을 수 있습니다. OS X에서 루트 폴더에서 opengl-series.xcodeproj 파일을 열고 이 문서에 해당하는 대상을 선택합니다. Windows에서 Visual Studio 2013에서 opengl-series.sln 파일을 열고 이 문서에 해당하는 프로젝트를 엽니다. 가장 간단한 예에서, 예제 5-1에서와 같이 라이트 위치는 고정된 상태로 유지됩니다. 이 효과를 얻으려면 사용하는 보기 및/또는 모델링 변환 후 라이트 위치를 설정해야 합니다. 예제 5-4에서 init() 및 모양() 루틴의 관련 코드는 다음과 같을 수 있습니다. 조명을 사용하지 않도록 설정하려면 GL_LIGHTING을 인수로 glDisable()를 호출합니다. 지금까지의 모든 조명 계산에서는 선형 색상 공간을 작업하고 있다고 가정했습니다.

선형 색상 공간에서 RGB 색상 값 중 하나를 두 배로 늘리면 화면의 픽셀이 두 배 밝아야 합니다. 예를 들어 100% 적색 $$(1,0,0)$$는 50% 적색 $$(0.5,0,0)$$보다 두 배 밝아야 합니다. 3차원 오브젝트로 구성된 장면을 그릴 때 일부 오브젝트는 다른 오브젝트의 전부 또는 일부를 가릴 수 있습니다. 관점을 변경하면 모호한 관계가 변경될 수 있습니다. 예를 들어, 반대 방향에서 장면을 보는 경우 이전에 다른 오브젝트 앞에 있던 오브젝트가 이제 그 뒤에 있습니다. 사실적인 장면을 그리려면 이러한 모호한 관계를 유지해야 합니다. OpenGL 조명 모델은 조명을 방사, 주변, 확산 및 스페큘러의 네 가지 독립적인 구성 요소로 나눈다고 가정합니다. 네 개의 구성 요소는 모두 독립적으로 계산된 다음 함께 추가됩니다. 실시예 5-1은 하나의 백색 광원만을 사용한다.

해당 위치는 glLightfv() 호출에 의해 지정됩니다. 이 예제에서는 흰색인 라이트 0(GL_LIGHT0)에 대한 기본 색상을 사용합니다. 색이 다른 라이트를 원한다면 glLight*()를 사용하여 이를 나타냅니다. 다양한 색상의 장면에 최소 8개의 서로 다른 광원을 포함할 수 있습니다. 이러한 다른 라이트의 기본 색상은 검은색입니다. 사용 중이면 8개 이상을 사용할 수 있습니다. 책상 램프가 될 것 같은 장면 근처에 배치하거나 태양처럼 무한한 거리 , – 당신은 또한 당신이 원하는 곳마다 조명을 찾을 수 있습니다. 또한 빛이 좁고 집중된 빔을 생성하는지 또는 더 넓은 빔을 생성하는지 여부를 제어할 수 있습니다.