Direct3D를 사용하여 선 목록을 그릴 때 선의 두께를 어떻게 변경합니까?Direct3D 선 두께
This post은 줄 너비가 지원되지 않으며 해결 방법을 제공한다고 말합니다. 다른 옵션?
이 주제를 다루는 동안 셰이더를 사용하여 대시 패턴으로 선을 그릴 수 있습니까?
Direct3D를 사용하여 선 목록을 그릴 때 선의 두께를 어떻게 변경합니까?Direct3D 선 두께
This post은 줄 너비가 지원되지 않으며 해결 방법을 제공한다고 말합니다. 다른 옵션?
이 주제를 다루는 동안 셰이더를 사용하여 대시 패턴으로 선을 그릴 수 있습니까?
쿼드의 너비가 화면 공간에서 일정하고 원하는대로 일치하도록 쿼크 (두 개의 삼각형으로 만든 삼각형 스트립)를 입력으로 사용하여 입력을 가져 오는 지오메트리 셰이더를 사용할 수 있습니다 선 두께. 그것은 완벽하게 잘 작동합니다 (CAD 3D 엔진에서 구현 됨).
지오메트리 셰이더가 옵션이 아닌 경우, 해결 방법은 버텍스 셰이더를 사용하는 것이지만 VB의 재 작업이 필요합니다. VS는 전체 라인 세그먼트에 대한 지식을 가지고 있어야하므로 VB 요소 각각에 대해 p 및 p + 1을 저장하게되며 인덱스/중복의 비용 (사용 된 토폴로지 및 라인을 인덱스 된 프리미티브로 렌더링하는 경우).
성능이 문제가되지 않는다면 CPU를 확장하는 것이 좋습니다.
편집 : 대시 패턴 소개
: 당신이 glLineStipple
동작을 에뮬레이션하기 위해 너무 지오메트리 쉐이더를 사용할 수 있습니다. 토폴로지가 GL_LINES
인 경우, 즉 분리 된 선이있는 경우 새 선 세그먼트마다 패턴이 다시 시작됩니다. 따라서 선분의 화면 공간 수평 시작 (또는 방향에 따라 수직 시작)을 기하 구조 셰이더에서 계산하고이 추가 정보를 픽셀 쉐이더에 전달하면됩니다. 그런 다음 픽셀 쉐이더는 요소 및 패턴 값 (DirectX 10/11 정수 및 비트 명령어는 쉽게 사용할 수 있음)에 따라 파편을 삭제할 책임이 있습니다.
이 방법은 잘 작동하며 에뮬레이션 된 폭선과 결합 할 수 있습니다 (위에서 언급 한 첫 번째 기법 사용).
토폴로지가 GL_LINE_STRIP
인 경우 패턴은 새로운 각 기본 그리기에서 다시 시작됩니다. 따라서 새로운 그리기 호출마다 패턴이 다시 시작됩니다. 이전에 렌더링 된 픽셀 수와 각 선분에 대한 지식이 필요하기 때문에 상황이 좀 더 복잡해집니다.
DirectX 10 스트림 - 아웃 기능 (이 VB의 각 요소는 각 세그먼트의 화면 공간 길이에 해당)을 사용하여 임시 VB에서 라인 스트립을 렌더링 할 때이를 달성 할 수 있습니다. 그런 다음이 VB의 병렬 접두사 합계 (일명 스캔)를 수행해야합니다 (각 선분 길이 값 누적).
마지막으로 GL_LINES
과 같은 줄무늬를 렌더링하지만 PS에서이 여분의 Scan VB 정보를 사용합니다.
선 두께는 Direct3D에서 지원되지 않을뿐만 아니라 현재 존재하는 GPU에서도 지원하지 않습니다. 내가 알고있는 GPU가 없다는 것도 알고 있습니다. 올바른 선을 그릴 수도 있습니다 (모두 축퇴 다각형을 사용하여 가짜 선을 만듭니다 - 즉, 두 번째 및 세 번째 정점이 같은 위치에 있으므로 삼각형이 본질적으로 한 줄로 붕괴됩니다.).
OpenGL에서 선 너비를 설정할 수 있지만 OpenGL 드라이버는 돌출 된 쿼드 (현재 GPU에서 지원되지 않으며 각 쿼드에 대해 두 개의 삼각형을 사용하여 에뮬레이션 됨)를 만들어서 화면.
그런 목적으로 돌출 된 사각형을 만드는 방법이 없을 것입니다. 스트링거 벨 (Stringer Bell)이 그의 대답에서 설명했듯이이를 달성하는 데는 여러 가지 방법이 있습니다.
저에게 맞는 가장 쉬운 방법은 선의 오른쪽 또는 왼쪽 가장자리에 따라 "오른쪽"또는 "왼쪽"을 가리키는 법선을 사용하여 각 정점이 두 번 포함 된 정점 버퍼를 만드는 것입니다. 그런 다음 매우 간단한 버텍스 쉐이더가 (정상 벡터의 배수로 버텍스 위치를 변경하여) 압출을 수행 할 수 있습니다. 이렇게하면 CPU에서 지오메트리를 다시 계산하지 않고도 선 너비를 빠르게 변경할 수 있습니다. 이는 객체의 크기 또는 거리에 따라 선 너비를 조정하려는 경우 유용 할 수 있습니다. 당신의 대시 패턴 (전각) 문제에 대해서는
는이것은 directx11에서 지원되지 않습니다 ... – yvetterowe
, 당신의 최선의 방법은 얇은 쿼드로 라인을 렌더링과 질감이 대시 패턴이 들어있는 픽셀 쉐이더에서 여기에 텍스처를 적용하는 아마. 샘플러 주소 모드를 줄 바꿈으로 설정해야합니다.
SamplerState wrapTriLinear {
AddressU = WRAP;
AddressV = WRAP;
}
이것은 흥미로운 해결책입니다. glLineWidth 호출과 동일한 결과를 얻으려고 했습니까 (픽셀 단위로)? – Stringer
픽셀 단위로 검사하지는 않았지만, 텍스쳐링되지 않은 앤티 엘리 어싱 된 라인의 경우 결과는 충분히 유사해야합니다. 예를 들어 OpenGL의 점 무늬 패턴을 에뮬레이트하기 위해 텍스처를 사용하면 텍스쳐 좌표의 비선형 보간법 (NVidia Quadros가 놀랍게도 나쁜 점은 대부분 Geforce 부분과 비교해도)을 통해 고통의 세계로 빠져들 수 있습니다. 셰이더는 텍스코 코드를 올바르게 얻으려면 많은 추가 작업을 수행해야합니다. – Pepor
직접 시도해 볼 수 있습니다. 텍스처 좌표에 대해 일종의 "화면 픽셀의 선 길이"를 사용하고 점 무늬가있는 텍스처로 선을 그립니다. 패턴이 얼마나 고르지 않은지 놀랄 것입니다. 적어도 나는 그렇다. ;-) – Pepor