2.5D 세계에서 깊이 테스트와 텍스처 투명도를 함께 사용하려면 어떻게합니까?


11

참고 : 나는 이미 대답을 찾았습니다 (이 질문 후에 게시 할 것입니다)-내가 올바르게하고 있는지 또는 더 나은 방법이 있는지 궁금합니다.

OpenGL ES (JOGL)를 사용하여 "2.5D"아이소 메트릭 게임을 만들고 있습니다. "2.5D"는 세계가 3D이지만 2D 등각 타일을 사용하여 렌더링됨을 의미합니다.

내가 해결해야했던 원래 문제는 텍스처를 순서대로 (뒤에서 앞으로) 렌더링해야 타일이 올바르게 겹쳐서 적절한 효과를 내야한다는 것입니다. 약간의 독서 후에, 나는 이것이 "오래된 모자"2D 접근법이라는 것을 빨리 깨달았습니다. 플레이어가 3D 세계를 수정할 수 있기 때문에 효율적으로 수행하기가 어려워졌습니다 (따라서 물건이 3D 공간의 어느 곳에 나 나타날 수 있음). 심도 버퍼를 이용하는 것이 논리적 인 것처럼 보였습니다. 즉, 올바른 순서로 물건을 렌더링하는 것에 대해 걱정할 필요가 없었습니다.

그러나 나는 문제에 직면했다. 당신이 사용하는 경우 GL_DEPTH_TESTGL_BLEND함께, 그것은 그들이 (당신은 투명성이 있어야한다 중복의 이상한 종류를 얻을 수 있음을 의미) Z 순서에 의해 "분류"전에 객체가 배경으로 블렌딩 효과를 만듭니다.

투명도 중첩 문제

다음은 문제를 설명 해야하는 의사 코드입니다 (실수로 Android 용 libgdx를 사용하고 있습니다).

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_BLEND);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    // ...
    // bind texture and create vertices
    // ...
}

따라서 질문은 투명도 중첩 문제를 어떻게 해결합니까?


2
내가 2D 엔진에서 당신과 똑같은 방식으로 갔다는 것을 언급하는 의견 : 먼저 영리하고 Z 정렬 타일을 시도한 다음 장면이 평평 해야하는 이유가 없다는 것을 깨닫고 타일에 Z 좌표 및 활성화 알파 테스트. 당신이
옳은지 확실

답변:


7

자, 여기 내 해결책이 있습니다 (더 잘 할 수 있다면 의견을 말하십시오) ...

실제로 알파 테스트를 사용해야한다는 것이 밝혀졌습니다 (사실로 우연히 발견 했으므로 이것이 왜 효과가 있는지는 확실하지 않습니다).

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_ALPHA_TEST);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0);

    // ...
    // bind texture and create vertices
    // ...
}

GL_ALPHA_TEST및 의 사용에 유의하십시오 glAlphaFunc.


내 문제도 해결되었습니다. 공유해 주셔서 감사합니다. 당신은 훌륭합니다
Mathlover

2

알파 테스트는 렌더러가 z 버퍼를 포함한 모든 버퍼에 픽셀을 그리는 것을 중지하는 데 사용됩니다. 알파 블렌딩은 시각적 인 것입니다. 값은 여전히 ​​zbuffer에 기록되므로 이와 같은 문제가 발생할 수 있습니다. 보이지 않는 픽셀은 이후 렌더링되는 픽셀 앞에 있으므로 새 픽셀을 그릴 때 ztest가 실패합니다. 이것은 당신이 준 이미지에서 볼 수있는 것입니다, ztest 실패.

z 쓰기를 끄면 동일한 결과를 얻을 수 있지만 모든 것을 int 순서로 다시 그려야합니다. 아이소 메트릭 게임에서 할 수있을만큼 쉬워야합니다.


1
고정 Y 평면이 있고 디자이너가 세계를 완전히 제어 할 때만 2D 아이소 게임에서 뒤에서 앞으로 물건을 그리는 것이 쉽다고 생각합니다. 그러나 물건이 3D 공간의 어느 곳에 나 존재할 수 있고 사용자가 물건을 변경할 수있게되면 더 복잡해집니다. 깊이 버퍼를 사용하면 인생이 훨씬 쉬워 질 것이라고 생각합니다.
Nick Bolton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.