나는 조건부로 일부 정점을 삭제하고자하는 버텍스 쉐이더에서 일하고 있어요 :셰이더 최적화 : 삼항 연산자가 분기와 동일한가요?
float visible = texture(VisibleTexture, index).x;
if (visible > threshold)
gl_Vertex.z = 9999; // send out of frustum
나는 이웃 데이터 사이의 작은 공통점이있을 때 가지 성능을 죽일 것을 알고있다. 이 경우, 다른 모든 버텍스는 서로 다른 'visible'값을 가질 수 있습니다. 이는 내 이해에 따라 로컬 쉐이더 코어 클러스터의 성능에 좋지 않습니다.
내 질문에 : (가독성 문제와 관계없이) 3 항 연산자가 더 좋습니까?
float visible = texture(VisibleTexture, index).x;
gl_Vertex.z = (visible > threshold) ? 9999 : gl_Vertex.z;
그렇지 않다면 계산할 가치가 있습니까?
float visible = texture(VisibleTexture, index).x;
visible = sign(visible - threshold) * .5 + .5; // 1=visible, 0=invisible
gl_Vertex.z += 9999 * visible; // original value only for visible
기하학 쉐이더에 의존하지 않고 정점을 드롭하는 더 좋은 방법이 있습니까?
미리 도움을 청하십시오!
정보 주셔서 감사합니다! – sharoz
삼항 연산자는 구문론적인 설탕이 아닙니다. 적어도 x86에서는 분기 예측과 함께 파이프 라이닝 최적화를 수행합니다 (여기에서 OP를 유용하게 활용할 수 있습니다). 나는 이것이 GPU가 아니라 CPU라는 것을 알고 있지만, 언급 할 만하다고 느꼈다. – GraphicsMuncher
컴파일러는 똑똑합니다. – Olhovsky