2012-09-18 2 views
0

자바를 사용하여 1995 년부터 3D 게임 프로그래밍의 블랙 아트 (Black Art of Programming)를 기반으로 한 매우 원시적 인 3D 그래픽 엔진을 작성했습니다. 화면에 단색 폴리곤을 그리고 장면을 중심으로 카메라를 움직일 수있는 시점까지갔습니다. ". 한 번에 너무 많은 반투명 픽셀을 표시하지 않는 한 반투명 개체를 올바르게 처리하는 Z 버퍼가 Z로 정렬됩니다. 나는 조명을 추가하고 싶은 시점에있다. 나는 그것을 간단하게하고 싶다, 그리고 주변의 빛은 충분히 단순 해 보인다, 지향성의 빛도 꽤 간단해야한다. 하지만 저는 광원을 움직여 매우 원시적 인 그림자를 드리 우는 기능을 가진 점 조명을 원합니다 (주로 벽을 통해 빛이 비치는 것을 원하지 않습니다).점 광원을 구조화하는 방법은 무엇입니까?

내 문제는 내가이 문제에 접근하는 가장 좋은 방법을 모른다는 것입니다. 나는 점 광원이 일정한 각도에서 광선을 주조한다고 상상해 봅니다. 그리고이 광선들이 다각형을 교차 시키면 그 다각형을 조명하고 앞으로 움직이지 않을 것입니다. 그러나 여러 개의 광원과 여러 개의 다각형이있는 장면을 생각할 때 매우 느릴 것이라고 생각합니다. 또한 두 개의 광선 사이에 떨어지는 경우 광원으로부터 멀리 떨어진 다각형이있는 경우를 처리하는 방법을 알지 못합니다. 나는 각 광원에 최대 거리를 줄 것이고, 만약 내가 충분한 광선을 주었다면, 그 거리 내에 어떤 두 개의 광선이 너무 멀어서 다각형을 놓칠 수없는 지점이 없어야한다. 수행 할 계산.

내 질문은 : 광원을 빠르게 가리 키거나 더 잘 정리하기 위해 광원을 가리키는 트릭이 있습니까? 루프에 중첩 된 악몽을 터뜨릴 까봐 걱정됩니다. 내가 직접 작성하고 싶기 때문에 OpenGL이나 Direct3D 또는 다른 속임수를 사용할 수 없습니다.

지금까지 내 결과를보고 싶다면 여기 youtube 비디오가 있습니다. 이미 나쁜 카메라 회전을 수정했습니다. http://www.youtube.com/watch?v=_XYj113Le58&feature=plcp

답변

0

실시간 3D 응용 프로그램을위한 조명은 매우 단순한 근사값으로 이루어집니다 (또는 과거에는 일반적으로 일반적이었습니다). http://en.wikipedia.org/wiki/Shading을 참조하십시오. 그림자는 비쌉니다. 일반적으로 3d 엔진을 래스터 화하는 작업은 shadow maps & Shadow Volumes을 통해 수행했습니다. 포인트 라이트는 그림자를 더욱 비싸게 만듭니다.

동적 실시간 광원은 게임에서 일반적인 기능으로 만 사용되었습니다. 단순히 렌더링 시스템에 과도한 부담을주기 때문입니다. 그리고이 게임들은 전용 그래픽 카드를 사용합니다. 따라서 동적 그림자 캐스팅 포인트 라이트를 포함 시키려면 엔진에서 좋은 성능을 얻으려고 노력해야 할 것 같습니다.

오늘은 조명이 두 가지 방법으로 적용 할 수 있도록 다반 :

  1. 전통적으로이 "앞으로 렌더링"이었다. 이 방법에서는 모든 정점 (정점 당 조명을하는 경우) 또는 단편 (픽셀 당 픽셀을 수행하는 경우)에 대해 각 광원의 기여도를 계산합니다.
  2. 더 최근에는 기하학과 법선과 같은 추가 데이터가 모두 중간 버퍼로 렌더링되어 조명 기여도를 계산하는 데 사용되는 "지연된"조명이 널리 보급되었습니다. 이렇게하면 조명 계산은 형상 수에 의존하지 않습니다. 그러나 다른 많은 오버 헤드가 있습니다.

많은 옵션이 있습니다. 지난 몇 년 동안 전용 그래픽 카드에서 사용 된 기본 모델보다 훨씬 복잡한 것을 구현하는 것은 어려울 것입니다!

내 제안은 그림자가없는 간단한 조명으로 시작하는 것이 좋습니다.거기에서 확장하고 최적화 할 수 있습니다.


왜 광선 - 삼각 교차 검사를하고 있습니까? 빛에 도달 할 수있는 삼각형 만 밝게하려고합니까? Ray-triangle 모든 폴리곤을 가진 모든 빛의 교차점은 매우 비싸다고 생각합니다. 그림자가없는 조명의 경우 일반적으로 을 각면을 반복합니다 (또는 모든 정점을 통해 정점별로 수행하는 경우). &은 빛 당 조명 기여도를 계산합니다. 사용자가 래스터 라이 제이션을 시작하기 바로 전에이 작업을 수행 할 수 있습니다 어떤 경우 든 모든 폴리를 통과 할 수 있습니다.

어떤 조명 모델을 사용하여 조명을 계산할 수 있습니다.이 조명 모델은 표면의 법선의 내적 및 빛에서 표면으로의 방향 벡터를 기반으로 표면을 음영 처리하는 매우 단순한 것입니다 (Lambertian reflectance). 벡터가 같은 공간에 있는지 확인하십시오! 이것은 아마도 당신이 당신이 이상한 결과를 얻고있는 이유 일 것입니다. 서페이스 법선이 월드 공간에있는 경우 월드 공간 광원 벡터를 계산해야합니다. 특정 공간에서 조명을 계산할 때 많은 이점이 있습니다. 나중에 나중에 살펴 보도록하겠습니다. 이제는 기본을 설정하고 실행하는 것이 좋습니다. 또한 Blinn-phong을보십시오 - 이것은 수년간 사용 된 쉐이딩 모델 그래픽 카드입니다.

그림자가있는 조명 - 내가 게시 한 링크를 살펴보십시오. 현실적인 조명은 계산하기에 너무 비싸므로 개발되었습니다.

그런데 LaMothe는 3D Game Programming Gurus의 트릭 - 고급 3D 그래픽 및 래스터 화라는 후속 책을 가지고있었습니다.
3D 엔진 프로그래밍의 모든 단계를 안내합니다. 나는 검은 미술 책 표지가 무엇인지 잘 모릅니다.

+0

정보를 제공해 주셔서 감사합니다. 내가 발견 한 점 광원과 광선 - 삼각형 교차 알고리즘을 사용하여 평면 쉐이더를 설정하려고했습니다. 내 큐브의 측면이 다른 색조로 렌더링되고 있지만 광선과 평행 한면이 광원을 향하는면보다 밝아서 내 큐브의 반대쪽면이 너무 밝게 표시됩니다. 나는 교차로 탐지 권리를하지 않았다고 의심한다. 나는 단지 320 x 240 픽셀 밖에 가질 수 없다는 점에서 이점을 가지고 있으며, 폴리곤 수를 낮게 유지할 계획이지만, 이것은 어려울 것입니다. 대부분의 행렬 대수를 잊어 버렸습니다. – user137

+0

행렬 수학/선형 대수학을 다듬어야 할 것입니다. 3D 그래픽은 무엇에 관한 것입니까? P 답변을 업데이트했습니다. 답장이 코멘트에 맞지 않았습니다. – unohoo

+0

빛이 벽을 통과 할 수 없도록 교차 테스트를하고 싶었습니다. 저는 물건이나 가구 등을 움직일 때 그림자가 생기는 것을 원하지 않습니다. 벽이나 바닥은 테스트 할 폴리곤 수가 적을 것이라고 생각했습니다. 나는 조명 모델이 검은 미술 책을 사용하는 것은 램버트 모델과 같다고 생각하지만 수식을 다시 확인해야합니다. 음영의 경우 평면 음영이 아니라면 gourad 음영을 사용하려고했습니다. 다른 책을보아야 할 수도 있습니다. 검은 미술 책은 현대 컴퓨터로 잘 번역되지 않는 DOS와 mode13H를 기반으로 한 많은 트릭을 사용합니다. – user137

관련 문제