VB6 프로그래밍 : DirectX 2D 그래픽 학습 로그 16 강의 10 요약

VB6 프로그래밍 : DirectX 2D 그래픽 학습 로그 16 강의 10 요약
튜토리얼 다운로드 주소 : https://download.csdn.net/download/gosub60/13696651
이 강의 작성자는 일부 프로세스를 모듈화했으며 모듈화의 이점은 자명합니다. 은유.

모듈 1 : DirectX 및 Direct3D를 초기화합니다.
이 모듈의 주요 기능 ** ① DirectX와 Direct3D를 초기화합니다. ② 버텍스 셰이딩과 같은 전체 화면 또는 창을 기반으로 렌더링 장치를 생성합니다 (두 점은 앞에서 요약 했음).
③ 현재 할당 된 텍스처의 상태 값을 설정합니다. ** SetTextureStageState를 사용
하여 다음과 같이 함수 프로토 타입 C ++ 소스 코드 습니다.

HRESULT SetTextureStageState(
  DWORD                    Stage,
  D3DTEXTURESTAGESTATETYPE Type,
  DWORD                    Value
);

매개 변수는 다음과 같이 설명됩니다.
단계 : 상태 값이 설정된 텍스처의 단계 식별자입니다. 단계 식별자는 0부터 시작합니다. 장치는 최대 8 개의 텍스처를 설정할 수 있으므로 Stage에서 허용하는 최대 값은 7입니다.

유형 : 설정할 텍스처 상태입니다. 이 매개 변수는 D3DTEXTURESTAGESTATETYPE 열거의 모든 멤버가 될 수 있습니다 . (예 : D3DTSS_MINFILTER = 17)
열거 유형은 다음과 같습니다.

typedef enum D3DTEXTURESTAGESTATETYPE { 
  D3DTSS_COLOROP                = 1,
  D3DTSS_COLORARG1              = 2,
  D3DTSS_COLORARG2              = 3,
  D3DTSS_ALPHAOP                = 4,
  D3DTSS_ALPHAARG1              = 5,
  D3DTSS_ALPHAARG2              = 6,
  D3DTSS_BUMPENVMAT00           = 7,
  D3DTSS_BUMPENVMAT01           = 8,
  D3DTSS_BUMPENVMAT10           = 9,
  D3DTSS_BUMPENVMAT11           = 10,
  D3DTSS_TEXCOORDINDEX          = 11,
  D3DTSS_BUMPENVLSCALE          = 22,
  D3DTSS_BUMPENVLOFFSET         = 23,
  D3DTSS_TEXTURETRANSFORMFLAGS  = 24,
  D3DTSS_COLORARG0              = 26,
  D3DTSS_ALPHAARG0              = 27,
  D3DTSS_RESULTARG              = 28,
  D3DTSS_CONSTANT               = 32,
  D3DTSS_MINFILTER               =17
  D3DTSS_FORCE_DWORD            = 0x7fffffff
} D3DTEXTURESTAGESTATETYPE, *LPD3DTEXTURESTAGESTATETYPE;

값 : 텍스처 단계의 텍스처 필터링 모드를 정의합니다. 설정할 상태 값입니다. 이 값의 의미는 Type 매개 변수에 의해 결정됩니다. D3DTEXTUREFILTERTYPE 열거는 다음과 같습니다.

typedef enum D3DTEXTUREFILTERTYPE { 
  D3DTEXF_NONE             = 0,
  D3DTEXF_POINT            = 1,
  D3DTEXF_LINEAR           = 2,
  D3DTEXF_ANISOTROPIC      = 3,
  D3DTEXF_PYRAMIDALQUAD    = 6,
  D3DTEXF_GAUSSIANQUAD     = 7,
  D3DTEXF_CONVOLUTIONMONO  = 8,
  D3DTEXF_FORCE_DWORD      = 0x7fffffff
} D3DTEXTUREFILTERTYPE, *LPD3DTEXTUREFILTERTYPE;

이 예의 호출은 다음과 같습니다.

'不需要这些行,但能够过滤掉
     '使它们看起来更好的纹理。
        Direct3D_Device.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_POINT
        Direct3D_Device.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_POINT

④ 에러 처리 프로그램이 추가되며, DX 초기화에 실패하면 에러 처리 프로그램이 호출되고 프로그램이 종료됩니다.

On Error GoTo Error_Handler

Error_Handler:
    
    MsgBox "初始化DirectX时发生错误!", vbCritical
    
    Close_Program
    
    DirectX_Initialize = False

모듈 2 : Create_Polygon () 'Create polygon subroutine
이 코드는 Create_TLVertex 함수를 사용하여 이전에 소개 된 다각형을 생성합니다.

모듈 3 : Load_Texture '파일에서 텍스처 맵로드이 과정은 주요 내용에 중점을 둡니다.
사용되는 함수는 다음과 같습니다. CreateTextureFromFileEx 는 파일에서 텍스처를 만듭니다. 이것은 D3DXCreateTextureFromFile 보다 고급 기능입니다.

함수 선언은 다음과 같습니다.

Function CreateTextureFromFileEx(Device As Direct3DDevice8, SrcFile As String, Width As Long, Height As Long, MipLevels As Long, Usage As Long, PixelFormat As CONST_D3DFORMAT, Pool As CONST_D3DPOOL, Filter As Long, MipFilter As Long, ColorKey As Long, SrcInfo As Any, Palette As Any) As Direct3DTexture8

매개 변수 설명 :
장치 : 텍스처와 연관 될 장치를 나타내는 IDirect3DDevice9 인터페이스의 포인터 .

SrcFile : 지정된 파일 이름의 문자열에 대한 포인터. 컴파일러 설정에 유니 코드가 필요한 경우 데이터 유형 LPCTSTR은 LPCWSTR로 구문 분석됩니다. 그렇지 않으면 문자열 데이터 유형이 LPCSTR로 구문 분석됩니다.

너비 : 너비 (픽셀 단위). 값이 0 또는 D3DX_DEFAULT이면 파일에서 크기를 가져와 2의 거듭 제곱으로 반올림합니다. 기기가 2 제곱의 비 전력 텍스처를 지원하고 D3DX_DEFAULT_NONPOW2가 지정된 경우 크기가 반올림되지 않습니다.

높이 : 높이 (픽셀 단위), 기타 설명은 위와 동일합니다.

MipLevels : 요청 된 Mip 레벨 수입니다. 값이 0 또는 D3DX_DEFAULT이면 완전한 밉맵 체인이 생성됩니다. D3DX_FROM_FILE이면 크기는 파일의 크기와 정확히 같고 장치 기능을 위반하면 호출이 실패합니다.

사용법 : Usage, 0, D3DUSAGE_RENDERTARGET 또는 D3DUSAGE_DYNAMIC. 이 플래그를 D3DUSAGE_RENDERTARGET으로 설정하면이 표면이 렌더링 대상으로 사용됨을 나타냅니다. 그런 다음 리소스를 SetRenderTarget 메서드의 pNewRenderTarget 매개 변수에 전달할 수 있습니다. D3DUSAGE_RENDERTARGET 또는 D3DUSAGE_DYNAMIC이 지정된 경우 Pool을 D3DPOOL_DEFAULT로 설정해야하며 애플리케이션은 CheckDeviceFormat을 호출하여 기기가이 작업을 지원하는지 확인해야합니다. D3DUSAGE_DYNAMIC은 표면이 동적으로 처리되어야 함을 나타냅니다. 동적 텍스처 사용을 참조하십시오 .

PixelFormat : 텍스처 요청의 픽셀 형식을 설명하는 멤버 D3DFORMAT 열거 형입니다. 반환 된 텍스처의 형식은 Format에서 지정한 형식과 다를 수 있습니다. 응용 프로그램은 반환 된 텍스처의 형식을 확인해야합니다. D3DFMT_UNKNOWN이면 파일에서 형식을 가져옵니다. D3DFMT_FROM_FILE을 사용하는 경우 형식은 파일의 형식과 정확히 동일하며 장치 기능을 위반하면 호출이 실패합니다.

풀 : 메모리 클래스가 배치되어야하는 텍스처를 설명하는 구성 요소의 D3DPOOL 열거 유형 입니다 .

필터 : 이미지 필터링 방법을 제어하는 ​​데 사용되는 하나 이상의 D3DX_FILTER 상수 조합입니다. D3DX_DEFAULT 지정이 매개 변수는 D3DX_FILTER_DITHER에 해당하는 D3DX_FILTER_TRIANGLE을 지정합니다.

MipFilter : 이미지를 필터링하는 방법을 제어하는 ​​데 사용되는 하나 이상의 D3DX_FILTER 상수의 조합입니다. 이 매개 변수에 D3DX_DEFAULT를 지정하는 것은 D3DX_FILTER_BOX를 지정하는 것과 같습니다. 또한 .dds 텍스처를 메모리로로드 할 때 건너 뛸 밉 레벨 수를 지정하려면 .bits 27-31을 사용하십시오 (밉맵 체인의 맨 위에서 시작). 이를 통해 32 단계까지 건너 뛸 수 있습니다.

ColorKey : D3DCOLOR 값을 투명한 검정색으로 바꾸 거나 0을 사용하여 색상 키를 비활성화합니다. 소스 이미지 형식에 관계없이 항상 32 비트 ARGB 색상입니다. 알파는 매우 중요합니다. 불투명 한 색상 키의 경우 일반적으로 FF로 설정해야합니다. 따라서 불투명 한 검정의 경우 값은 0xFF000000과 같습니다.

SrcInfo : D3DXIMAGE_INFO 구조 에 대한 포인터 . 소스 이미지 파일의 데이터 설명 또는 NULL로 채워집니다. (D3DXIMAGE_INFO의 기능은 이미지 파일의 원본 내용에 대한 설명을 반환하는 것입니다.)

팔레트 : 채울 256 색 팔레트를 나타내는 PALETTEENTRY 구조 에 대한 포인터 또는 NULL. (PALETTEENTRY 구조의 기능은 논리 팔레트에서 항목의 색상과 용도를 지정하는 것입니다.)

    Dim File_Path As String '贴图文件路径
    Dim Width As Long'
    Dim Height As Long
    Dim Transparency_Color As Long
    
    File_Path = App.Path & "\maps.jpg"

    Width = 1024
    Height = 768
    
    Transparency_Color = D3DColorRGBA(0, 0, 0, 0)

    Set Texture = Direct3DX.CreateTextureFromFileEx(Direct3D_Device, _
                                                    File_Path, _
                                                    Width, Height, _
                                                    0, _
                                                    0, _
                                                    D3DFMT_A8R8G8B8, _
                                                    D3DPOOL_MANAGED, _
                                                    D3DX_FILTER_POINT, _
                                                    D3DX_FILTER_POINT, _
                                                    Transparency_Color, _
                                                    ByVal 0, _
                                                    ByVal 0)

모듈 3 : Game_Loop 게임 루프 역할은 다각형을 그릴 텍스처를 설정하는 것입니다. 코드는 다음과 같습니다.

Do While Running = True
        
        DoEvents '允许事件发生,以便程序不会锁定。
        
         '清除后缓冲。
        Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, D3DColorRGBA(0, 0, 0, 0), 1#, 0
            
            Direct3D_Device.BeginScene
                
                '设置纹理
                
                Direct3D_Device.SetTexture 0, Texture
            
                '绘制多边形
                Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Vertex_List(0), Len(Vertex_List(0))
            
            Direct3D_Device.EndScene
        
        '将后缓冲区翻转到窗体窗口中。
        Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0
        
    Loop

① 텍스처 설정 : SetTexture : 사용자가 텍스처를 설정하기 위해 콜백 함수를 구현해야합니다. 함수는 다음과 같습니다 : SetTexture (stage As Long, texture As Direct3DBaseTexture8)

** Parameter 1 : stage : ** IDirect3DDevice9 :: SetTexture 또는 IDirect3DDevice9 :: SetTextureStageState 의 인덱스 값인 텍스처 할당 단계 입니다 .

매개 변수 2 : 텍스처 : 텍스처 개체에 대한 포인터. 모든 Direct3D 텍스처 유형 (큐브, 볼륨 등)이 될 수 있습니다. 이 예제에서 : Private Texture As Direct3DTexture8

② ' 다각형 그리기 : DrawPrimitiveUP 는 사용자 메모리 포인터에 의해 지정된 데이터를 지정된 유형의 기하학적 기본 요소 시퀀스로 표시합니다. VB의 정의는 다음과 같습니다.

Sub DrawPrimitiveUP(PrimitiveType As CONST_D3DPRIMITIVETYPE, PrimitiveCount As Long, VertexStreamZeroDataArray As Any, VertexStreamZeroStride As Long)

매개 변수 1 : PrimitiveType 기본 렌더링 유형을 설명하는 멤버 D3DPRIMITIVETYPE 열거 유형입니다.

매개 변수 2 : PrimitiveCount 렌더링 할 프리미티브의 수입니다. D3DCAPS9 구조의 MaxPrimitiveCount 멤버를 확인 하여 허용 되는 최대 프리미티브 수 결정합니다.

매개 변수 3 : VertexStreamZeroDataArray 정점 데이터에 대한 사용자 메모리 포인터.

매개 변수 4 : VertexStreamZeroStride의 각 정점에 대한 데이터 바이트 수입니다. 값은 0 일 수 없습니다.

이 예의 호출은 다음과 같습니다.

Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Vertex_List(0), Len(Vertex_List(0))

모듈 4 : Close_Program은 프로그램을 종료하고 메모리를 해제합니다.

마침내 성공적으로 그림을 만들었습니다.
생성 된 그래프

추천

출처blog.csdn.net/gosub60/article/details/111183271