최신 OpenGL에서 FBO 색상 첨부 파일의 데이터를 잘못된 조각으로 덮어 쓰지 않으려면 어떻게해야합니까?

스테판 바우어

OpenGL에 쿼드를 업로드하는 일괄 렌더링 파이프 라인이 있습니다. 이들은 FBO로 렌더링됩니다. 당연히 첨부 파일 중 하나는 시각적 출력이고 다른 하나는 깊이이므로 사후 처리 등을 허용합니다. 그러나 세 번째 첨부 파일은 여기 에 설명 된 것과 유사한 스타일로 선택을위한 객체 ID를 저장하기위한 것입니다 .

작은 문제가 있습니다. 일부 렌더링 된 항목이 피킹에 '투명'하도록하고 싶습니다. 기본적으로 일부 사물 (입자 또는 시각적 장식 등)은 자체적으로 선택할 수 없지만 뒤에있는 물체를 선택하는 것을 방지해서는 안됩니다.

이것이 어떻게 성취 될 수 있습니까? 웹 검색에 따르면 glAlphaFunc한때이 역할을 수행했을 수 있습니다. 투명 채널이있는 텍스처에 개체 ID를 압축 한 다음 투명도를 0으로 설정 한 모든 조각을 삭제할 수 있었기 때문입니다. 약간 이상하지만 작동 가능합니다. 그러나 그것은 감가 상각되었습니다.

유사한 문제에 대한 다른 일반적인 권장 사항은 discard키워드 를 사용하는 것 입니다. 이것은 지정된 첨부 파일뿐만 아니라 조각의 모든 출력 요소를 삭제하기 때문에 작동하지 않습니다.

여기서 해결책은 무엇입니까? 내가 볼 수없는 블렌드 함수로 할 수있는 영리한 것이 있습니까? 나는 꽤 당황합니다.


조각 셰이더는 다음과 같습니다.

#region Fragment

#version 440 core

layout(location = 0) out vec4 colour; // Visual
layout(location = 1) out uint interactLayer; // Picking

in vec2 texCoord;
in flat int texUnit;
in flat uint objectID;

uniform sampler2D[32] u_texData;

void main()
{
    vec4 c1 = fragmentColour * texture(u_texData[texUnit], texCoord);
    
    if (c1.w == 0.0f) { discard; }
    colour = c1;
    
    if (objectID == 0xffffffffu) {
        // Please don't write to interactLayer values,
        // but also please don't discard the 'colour' value.
    }
    else {
        interactLayer = objectID;
    }
}
니콜 볼 라스

조각을 버리는 것은 바이너리입니다. (모든 결과와 함께) 폐기되거나 승인됩니다.

또한 정규화되지 않은 정수 이미지 형식으로 블렌딩 할 수 없습니다. 혼합은 부동 소수점 유형 (정규화 된 정수 포함)간에 만 작동합니다.

가장 좋은 방법은 인덱스에 플로트 이미지 형식을 사용하는 것입니다. 정수를 셰이더로 캐스팅 한 다음 블렌딩을 사용하여 켜거나 끕니다. vec4적절한 알파 값을 쓸 수 있도록 셰이더에를 작성해야 합니다. a를 작성 vec4한다고해서 이미지 형식에 4 개의 구성 요소가 있어야 하는 것은 아닙니다. 여전히 1 개의 구성 요소를 가질 수 있으며 블렌딩은 작동해야합니다 (소스 알파 만 사용하는 한).

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관