2010-06-06 6 views
1

BitBlt 및 표준 VB6 드로잉 기능을 통해 많은 그림을 그리는 VB6 응용 프로그램 (웃지 마세요)이 있습니다. 성능 문제 (예, 메모리에 그리는 것과 같은 일반적인 트릭을 수행함)에 맞서 실행 중입니다. 그래서 다른 드로잉 방법을 연구하기로 결심했고 OpenGL이 생겼습니다.OpenGL에 상응하는 GDI의 HatchBrush 또는 PatternBrush?

나는 약간의 실험을 해왔고, 내가 원하는 것을 대부분하는 것은 간단했다. 응용 프로그램은 주로 단색의 비교적 큰 2D 직사각형과 같은 간단한 그림 만 사용합니다. 그러나 HatchBrush 또는 PatternBrush와 같은 것을 찾을 수 없었습니다.

더 구체적으로 말하면, 작은 단색 픽셀 패턴을 지정하고 색상을 선택하고 다각형 (또는 무엇이든)을 그릴 때마다 솔리드가 아닌 그 패턴으로 자동 바둑판 식으로 배열해야합니다. 패턴의 "on"비트가 지정된 색상으로 나타나고, 패턴의 "off"비트가 현재 그려져있는 영역 아래에 그려진 것이 표시됩니다.

물론 모든 계산을 직접 수행 할 수 있습니다. 즉, 어떻게 든 자동으로 바둑판 식으로 배열되는 다각형으로 그리는 대신, 실제로 그릴 필요가있는 모든 선이나 픽셀을 계산 한 다음 선이나 픽셀 등으로 그릴 수 있습니다. 그러나 쉬운 방법이 있습니까? GDI에서와 마찬가지로 "이 브러시를 사용하여이 다각형을 그립니다"라고 말하면 어디입니까?

나는 "질감"이 내가 원하는 것을 성취 할 수있을 것이라고 생각하지만, 나에게는 분명하지 않다 (나는 이것에 전혀 익숙하지 않고 내가 찾은 문서가 완전히 분명한 것은 아니다). 다각형의 꼭지점을 기준으로 질감이 비뚤어 지거나 패턴이 늘어나거나 늘어날 수있는 것처럼 보입니까? 반면 패턴을 바둑판 식으로 배열하고 싶습니다.

정확히 어떻게 픽셀/선/그려야 할 필요가있는 무차별 한 힘 계산과 다른 방법이 있습니까?

미리 도움을 청하십시오.

답변

2

정확하게 이해하면 glPolygonStipple() 또는 glLineStipple()을 찾고 있습니다.

PolygonStipple은 32x32 패턴 만 허용하므로 매우 제한적이지만 PatternBrush처럼 작동해야합니다. VB에서 그것을 구현하는 방법을 모르겠다.

+0

대단히 고마워! –

+0

그냥 시도해 보았습니다. 그게 바로 제가 원하는 것입니다. 다시 한 번 감사드립니다! –

0

아, 내가 찾은 것 같아! 전체 뷰포트에서 스텐실을 원하는 패턴 (또는 그 마스크, 추측)의 모양으로 만들 수 있습니다. 그런 다음 그 패턴으로 그릴 때 스텐실을 사용할 수 있습니다.

0

텍스처를 사용할 수 있습니다. 패턴을 이미지와 같이 넣고 반복해서 텍스처를 켜면 좋은 결과를 얻을 수 있습니다.

+0

감사합니다. 조사해 보겠습니다. 그렇지만 내가 위에 설명한 (패턴의 뷰포트 크기의 스텐실을 만드는) 위에서 설명한 것에 비해 이점이 있습니까? 그게 정상적으로 작동하는 것 같지만, 그것이 최선의 방법이라고 확신하지 못합니다. 다시 한번 감사드립니다. –

1

우선, 여기서 병목 현상 인 드로잉 작업 자체입니까? Visual Basic은 매우 느린 것으로 알려져 있습니다 (특히 프로그램이 중간 VM 코드 (기본 AFAIRC)로 컴파일 된 경우입니다. 네이티브 코드로 컴파일하는 옵션을 선택했는지 확인하십시오!). 코드가 병목 현상이 발생하면 OpenGL은 도움이되지 않습니다. C 또는 C++와 같은 다른 언어로 코드를 다시 작성해야하지만 .NET 언어도 마찬가지입니다.

OpenGL에는 점선과 다각형을 그릴 수있는 기능이 있지만 사용할 수는 없습니다. 오랫동안 사용하지 않으려는 버전 3.1의 OpenGL에서 제거되었습니다.이는 이유입니다. 이러한 기능은 현대의 렌더링 패러다임과 잘 맞지 않으며 현대 그래픽 하드웨어에서는 지원되지 않습니다. 느린 소프트웨어를 사용하면 이러한 기능이 저하 될 수 있습니다.

가는 방법은 작은 텍스처를 마스크로 사용하여 그려진 다각형 위에 바둑판 식으로 배열하는 것입니다. 텍스처는 정점과 함께 지정한 텍스처 좌표와 일치하도록 늘어나거나 압축됩니다. 두 질감 좌표에 대해 랩핑 모드를 GL_REPEAT으로 설정하고 각 정점에 대한 올바른 좌표를 계산하여 텍스처가 원래 크기로 나타나도록하고 올바른 양을 반복해야합니다.

설명한대로 스텐실 버퍼를 사용할 수도 있지만 패턴을 사용하여 해당 버퍼를 채우는 방법은 무엇입니까? 빨리? 어쨌든 텍스처가 필요할 것입니다. 드로잉을 시작하기 전에 매 프레임마다 스텐실 버퍼를 지워야한다는 것을 기억하십시오. 그렇게하지 않으면 의 용량이 (그래픽 하드웨어 및 드라이버 버전에 따라 "엄청난"의 정확한 값)이 될 수 있습니다.

프래그먼트 셰이더를 사용하여 원하는 효과를 얻는 것도 가능하지만, 그것에 대한 셰이더를 배우는 것은 OpenGL 초보자를위한 과장입니다 .-).

+0

그러나 glLogicOp는 여전히 텍스처를 사용할 수 있습니까? 예를 들어 스트라이프 텍스처를 먼저 생성 한 다음이를 직사각형에 매핑해야합니다. 그러나 논리적 연산 (GDI에서 브러시와 관련된 래스터 연산을 구현하는 데 필요)을 사용하면 성공할 수 없습니다. 당신의 도움이 등을위한 감사합니다 – user461426