문제

나는 OpenGL을 사용하여 1 인칭 슈터를 만들고 있으며 카메라 앞에서 총 모델을 떠나려고 노력하고 있습니다. 리소스 디 컴파일러를 사용하여 Fallout 3에서 모델을 찢어 냈습니다 (.obj로 변환하여로드).

그러나 이것은 화면에서 보이는 것입니다.

Screenshot

총의 삼각형의 절반은 푸러스 인 것처럼 보이는 것으로 잘립니다.

나는 다음과 같이 카메라 앞에 놓았다.

glPushMatrix();
    glLoadIdentity();

    glTranslatef(m_GunPos.x, m_GunPos.y, m_GunPos.z);
    glRotatef(m_GunRot.x, 1, 0, 0);
    glRotatef(m_GunRot.y, 0, 1, 0);
    glRotatef(m_GunRot.z, 0, 0, 1);
    glScalef(m_GunScale.x, m_GunScale.y, m_GunScale.z);

    m_Gun->Render(NULL);
glPopMatrix();

그래서 원본을 저장합니다 GL_MODELVIEW 매트릭스, Identity Matrix를로드하고 내 총을 카메라의 오른쪽에 약간으로 번역하여 렌더링합니다. 이것은 Scenenode의 렌더링 루틴입니다.

glPushMatrix();
    if (m_Model) { m_Model->Render(&final); }

    if (m_Children.size() > 0)
    {
        for (std::vector<SceneNode*>::iterator i = m_Children.begin(); i != m_Children.end(); ++i)
        {
            (*i)->Render(&final);
        }
    }
glPopMatrix();

따라서 자체 모델과 모든 어린이 Scenenode를 렌더링합니다. 마지막으로 실제 메쉬 렌더링은 다음과 같습니다.

if (m_Material)
{
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, m_Material->m_TexDiffuse);
}

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(Vec3), &m_Vertex[0]);
glNormalPointer(GL_FLOAT, sizeof(Vec3), &m_Normal[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &m_UV[0]);

glDrawArrays(GL_TRIANGLES, 0, m_Vertex.size());

glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

총만 클리핑을 끄는 방법이 있습니까? 다른 게임은 어떻게해야합니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

OpenGL의 관점 (말장난 의도가 없음)에서 좌절감은 또 다른 행렬입니다. Projection 행렬을 밀고, Gluperspective (또는 모험이라면 Glfrustrum)를 호출하여 Znear를 매우 작은 값으로 설정하고 건을 그리운 다음 Projection 매트릭스를 팝하고 나머지 장면을 그립니다 (Beware, Bewere, Beweal, Beweart. 그러나 투영 매트릭스 스택은 종종 꽤 얕다.

한 가지주의 사항 : 나는 이것이 Z-Fighting에 어떤 영향을 미쳐야하는지 결코 생각한 적이 없습니다. 그것은 진짜 좋은 일을하지 않을 수 있습니다. 전체 장면을 그리는 동안 작은 znear 값을 가진 것처럼 동일하게 작동 할 수 있습니다.

다른 팁

문제는 거의 근거리를 클리핑하는 평면으로 인해 발생합니다.

투영 행렬을 계산하는 데 사용한 Znear 값을 줄입니다. 그래도 필요한만큼 낮게 만듭니다. 낮을수록 Z-Fighting에 더 많은 문제가 생길 것입니다.

총을 장면으로 더 밀어 넣으려고 했습니까 (예 : 카메라에서 멀리)? 그렇게 할 때, 다각형이 여전히 잘린가? 그렇지 않으면, 제안대로, 당신의 모델은 가까운 클리핑 장소 (투영 행렬에 설정)에 의해 잘린다. 여전히 아티팩트가있는 경우 문제는 렌더 상태, 모델 로딩 등과의 다른 것이 될 수 있습니다.

일부 시청자에서 전체 모델을 보셨습니까? 어쩌면 그것이 모델의 모습과 폴리 카운트가 게임에서 해당 폴리를 볼 필요가 있기 때문에 최적화되었을 수도 있습니다.

총을 장면으로 더 멀리 밀어 내고 근처 비행기에 클립하지 않도록하는 이유는 무엇입니까?

캐릭터에 의해 무기 보유와 같은 가까운 객체를 렌더링 할 때 다른 Far-Far 클립 비행기를 지정해야합니다. 이로 인해 다른 장면 요소와 관련하여 조각의 창 공간 깊이 값이 유효하지 않으므로 gldepthrange를 호출하여 대상 깊이 범위를 수정해야합니다. 이렇게하면 물체 근처의 카메라의 정밀도를 높일 수 있습니다.

당신이 언급했듯이, 일반 장면의 FRUSTUM의 가까운 비행기 만 수정하는 것은 해결책이 아닙니다. Z-Fighting 문제를 도입하기 때문에 총을 앞으로/뒤로 이동하십시오.

다른 투영 행렬을 갖는 "레이어링"은 다른 레이어 사이의 깊이 값이 동일한 "공간"에 있지 않기 때문에주의를 기울이지 않으면 위험 할 수 있습니다. 여기서 레이어라고 부르는 것은 주어진 투영 행렬로 렌더링 된 객체 그룹입니다. 이에 대한 일반적으로 두 가지 해결책이 있습니다.

  1. 가장 먼 곳에서 시작하여 각각의 다른 층 (모든 객체를 사용하여)을 렌더링하고 각 렌즈 사이의 깊이 버퍼를 지우십시오.
  2. gldepthrange를 사용하여 레이어 사이의 깊이 버퍼를 분할하십시오.

이러한 기술을 사용하면 서로 싸우는 다른 레이어의 객체와의 잠재적 문제를 해결할 수 있지만 몇 가지 단점이 있습니다.

  1. 객체가 서로 교차하는 것을 방지합니다 (근처의 레이어는 항상 추가 레이어 위에 나타납니다. 절대 교차하지 않습니다). 때로는 총이 항상 모든 위에있는 FPS와 어쨌든 달성하고자하는 것입니다.
  2. PostFX (심도 등) 또는 이연 렌더링과 같은 것들에 대한 깊이 버퍼는 사용할 수 없습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top