opengl spotlight 예제

예상대로 glLightModel*() 명령은 조명 모델의 매개 변수를 설명합니다. 예제 5-1에서 명시적으로 정의된 조명 모델의 유일한 요소는 전역 주변 광원입니다. 또한 조명 모델은 장면뷰어가 장면과의 무한한 거리 또는 로컬로 간주되어야 하는지 여부와 장면의 오브젝트의 전면 및 후면 표면에 대해 조명 계산을 다르게 수행해야 하는지 여부를 정의합니다. 예제 5-1은 모델의 이러한 두 측면에 대한 기본 설정을 사용합니다( 무한 뷰어 및 단면 조명). OpenGL은 관측점과 각 오브젝트 사이의 각도를 계산해야 하기 때문에 로컬 뷰어를 사용하면 수행해야 하는 계산의 복잡성이 크게 늘어날 수 있습니다. 그러나 무한 뷰어에서는 각도가 무시되고 결과가 약간 덜 사실적입니다. 또한 이 예제에서는 구의 후면이 보이지 않으므로(구의 내부) 단면 조명으로 충분합니다. OpenGL 조명 모델의 요소에 대한 자세한 설명은 “조명 모델 선택”을 참조하십시오. 다음 방정식에서 수학 연산은 R, G 및 B 구성요소에서 별도로 수행됩니다. 따라서 예를 들어 세 개의 항이 함께 추가된 것으로 표시되면 각 용어의 R 값, G 값 및 B 값이 별도로 추가되어 최종 RGB 색상(R1+R2+R3, G1+G2+G3, B1+B2+B3)을 형성합니다.

세 개의 항을 곱하면 계산은 (R1R2R3, G1G2G3, B1B2B3)입니다. 정점의 최종 A 또는 알파 구성요소는 해당 정점에서 재질의 분산 알파 값과 같습니다. 이러한 선이 예제 5-1에 추가된 경우 구는 두 개의 라이트(한 방향 및 하나의 스포트라이트)로 점등됩니다. 또한 라이트 원뿔의 축을 결정하는 스포트라이트 방향을 지정해야 합니다. 이 효과를 얻으려면 사용하는 보기 및/또는 모델링 변환 후 라이트 위치를 설정해야 합니다. 예제 5-4에서 init() 및 모양() 루틴의 관련 코드는 다음과 같을 수 있습니다. 라이트 구조체는 방향 라이트와 스포트라이트를 수용하기 위해 약간 변경됩니다. 위치 요소는 glm::vec3에서 glm::vec4로 변경되고 두 개의 스포트라이트 원추 콘 변수 원방향 및 원뿔각도를 추가합니다.

RGBA 방정식의 분산 및 반사 용어로 시작합니다. 분산 항에서 분산등 * 확산 재질 대신 색 색 인덱스 모드의 이전 섹션에 정의된 대로 dci를 대체합니다. 마찬가지로, 스페큘러 용어에서 스페큘러 라이트 * 반사 물질 대신 이전 섹션에 정의된 대로 sci를 사용합니다. (감쇠, 스포트라이트 효과 및 이전과 같은 이러한 용어의 다른 모든 구성 요소를 계산합니다.) 이러한 수정된 확산 및 반사 용어 d와 s를 각각 호출합니다. 이제 s`= min{ s, 1 }을 계산한 다음 조명 관련 호출이 init() 명령에 있습니다. 다음 단락에서 간략하게 설명하고 이 장의 후반부에서 더 자세히 설명합니다. 예제 5-1에 대해 주의해야 할 한 가지는 색상 인덱스 모드가 아닌 RGBA 색상 모드를 사용한다는 것입니다. OpenGL 조명 계산은 두 모드마다 다르며 실제로 조명 기능은 색상 인덱스 모드에서 더 제한적입니다. 따라서 RGBA는 조명을 수행할 때 선호되는 모드이며 이 장의 모든 예제에서는 이를 사용합니다. 색상 색 색인 모드에서 조명에 대한 자세한 내용은 “색상 색인 모드의 조명”을 참조하십시오. AppMain에서 스포트라이트와 방향 라이트를 만듭니다.

GL_SPOT_CUTOFF 매개변수가 180.0이기 때문에 기본적으로 스포트라이트 피쳐는 비활성화됩니다. 이 값은 라이트가 모든 방향으로 방출된다는 것을 의미합니다(원뿔정점의 각도는 360도이므로 원뿔이 아님). GL_SPOT_CUTOFF의 값은 [0.0,90.0] 범위 내에 있는 것으로 제한됩니다(특수 값 180.0이 없는 경우). 다음 줄은 컷오프 매개변수를 45도로 설정합니다: 4장에서 보았듯이 OpenGL은 프레임 버퍼에 있는 최종 표시된 장면에서 각 픽셀의 색상을 계산합니다.

Share Button
Posted in Uncategorized.