2011-05-07 9 views
5

저는 OpenGL ES 1.1을 사용 중이며 Blender에서 OBJ 내보내기를 정점 데이터가 포함 된 일부 이진 파일로 변환하려고합니다. 실제로는 이미 작업 도구가 있지만 몇 가지를 변경하고 질문을 보았습니다.OBJ 형식 및 플랫 대 부드러운 음영

매끄러운 음영 처리를하더라도 올바른 법선 (얼굴면에 수직)을 사용하면 얼굴이 평평한 모양으로 나타납니다. 매끄러운 음영 처리가 가능하고 적절한 법선 (Blender에서 가장자리가 선명하고 가장자리 분할 수정자가 적용된 경우)을 사용하면 부드러운 부분과 날카로운 가장자리의 효과를 얻을 수 있습니다.

어디로 갈까요? 2 가지 질문이 있습니다.

  1. 이 (가) "의 1"또는 부드러운 또는 평면 음영은 부드러운 음영 및 법선 관점의 사용을 완전히 불필요 OBJ 파일에 표시되는 라인을 "OFF S"인가?

  2. 실제로 OpenGL에서 평면 음영으로 설정하면 법선이 완전히 무시됩니다 (또는 모두면에 수직 일 것으로 가정).

답변

9

꼭지점을 부드럽게 보이게하려면 그 법선이 인접한면 법선 (또는 비슷한 것)의 평균이되어야하지만면 평면에 수직이 아니어야합니다 (단, 인접면의 평균면을 제외하고는).

GL_FLAT는 얼굴의 색이 삼각형 위에 보간되지 않지만 하나의 삼각형 모서리에서 가져온 것입니다 (어느 것이 먼저인지 마지막인지 모름). 이 색상은 정점 색상 또는 정점 조명에서 제공되므로 사실 얼굴 당 법선을 얻을 수 있지만 꼭 얼굴 방향은 아니지만 모퉁이 꼭지점의 법선입니다.

OBJ 파일에서 정점 법선을 얻은 경우 s 부품이 필요하지 않습니다. 그러나 이것을 사용하여 정점 법선을 계산할 수 있습니다. s 부분은 스무딩 그룹이며 32 비트 비트 필드로 해석되어야합니다. 따라서 실제로는 32 개의 서로 다른 스무딩 그룹이 있으며 모든 얼굴이 하나 이상의 부분이 될 수 있습니다. 그래서 "s 5"라인 이후의 모든면들은 그룹 1과 3 (첫 번째와 세 번째 비트 세트)을 부드럽게하는 부분입니다. 두 개의 인접한면이 동일한 스무딩 그룹의 일부일 때 그 사이의 모서리는 매끄 럽습니다 (정점은 법선을 공유 함). 이렇게하면 꼭 필요한 정점 법선을 재구성 할 수 있습니다.

+0

부드러운 그룹은 비트 마스크로 해석해야하지만 OBJ 사양에서는이 방법을 사용하는 것이 매우 편리하므로 게임 엔진이 왜 이런 방식으로 처리 할 수 ​​있는지 알 수있는 것은 없습니다. – ideasman42

+0

@ ideasman42 음, 아마도 3DS 형식에서이 형식이 사용 되었기 때문에이 형식을 사용할 수 있습니다. 매끄러운 그룹 ID로 가져 가면 한 얼굴을 여러 그룹에 속하게 할 수 없습니다. –

+1

'5 "줄 이후의 모든면이 그룹 1과 3의 평활화의 일부가되어서는 안됩니다.'[...] 평활화 그룹 1과 4 '가되어야합니까? – PinkTurtle

1

gl_flat와 gl_smooth 사이의 모드를 변경해도 각 정점 법선을 사용할 때 렌더링에 영향을 미치지 않는 것처럼 보입니다. 내가 말할 수있는 것에서 당신의 문제는 각 얼굴이 오직 하나의 정상만을 가지고 있다는 것입니다. 매끄러운 음영 처리를 위해 각면은 3 개의 법선을 가져야하며 하나는 각 꼭지점마다 하나씩 있어야하며 모두 다르게해야합니다. 예를 들어, 원통의 법선은 원통의 내부에 투영 된 경우 모두 원통의 축에서 교차해야합니다. 모델에 부드러운 법선이있는 경우 OBJ 내보내기는 정점 법선별로 내 보내야합니다. 아마 얼굴마다 법선을 할당하는 것 같습니다. OpenGL-ES에서 렌더링하는 한, 스무딩 그룹은 사용되지 않으며 법선 만 사용됩니다.