游戏编程我最行吧 关注:41贴子:950
  • 12回复贴,共1

Directx11 画6边形,画三角形的太多了(网络上)

取消只看楼主收藏回复

1.先建立6边形的顶点结构,顶点结构有位置,颜色等等,我们就只建立位置的,如下:
struct SimpleVertex
{
XMFLOAT3 Pos; //XMFLOAT3 包含x,y,z 三维坐标
};

2.把6边形顶点数据,存入vertex buffer
SimpleVertex vertices[] =
{
XMFLOAT3( -0.5f, 0.25f, 0.0f ), // 顶点0
XMFLOAT3( 0.0f, 0.5f, 0.0f), // 顶点1
XMFLOAT3(0.5f, 0.25f, 0.0f ), // 顶点2
XMFLOAT3( 0.5f, -0.25f, 0.0f ), // 顶点3
XMFLOAT3( 0.0f, -0.5f, 0.0f ), // 顶点4
XMFLOAT3( -0.5f, -0.25f, 0.0f ), // 顶点5
};


IP属地:四川1楼2013-11-28 15:22回复
    3.D3d画图都是画三角形,所以要将6边形分割成4个三角形


    IP属地:四川来自百度输入法2楼2013-11-28 15:27
    回复
      2025-11-19 02:43:55
      广告
      不感兴趣
      开通SVIP免广告
      因为我们只有6个顶点,但要画4个三角形,要12顶点。。。所以,我们只要用索引的方式,告诉gpu就行了。。。如:(0,1,5)就是表示三角形1,但要顺时针方向来哦。。。。
      同理,(5,1,3)代表三角形2。。。。(1,2,3)代表三角形3。。。。(3,4,5)代表三角形4
      我们再用个存储器来存它,那就是索引存储,index buffer,
      WORD indices[] =
      {
      0,1,5,
      5,1,3,
      1,2,3,
      3,4,5,
      };


      IP属地:四川3楼2013-11-28 15:36
      回复
        // Create vertex buffer
        SimpleVertex vertices[] =
        {
        XMFLOAT3( -0.5f, 0.25f, 0.0f ), // 顶点0
        XMFLOAT3( 0.0f, 0.5f, 0.0f), // 顶点1
        XMFLOAT3(0.5f, 0.25f, 0.0f ), // 顶点2
        XMFLOAT3( 0.5f, -0.25f, 0.0f ), // 顶点3
        XMFLOAT3( 0.0f, -0.5f, 0.0f ), // 顶点4
        XMFLOAT3( -0.5f, -0.25f, 0.0f ), // 顶点5
        };
        D3D11_BUFFER_DESC bd;
        ZeroMemory( &bd, sizeof(bd) );
        bd.Usage = D3D11_USAGE_DEFAULT;
        bd.ByteWidth = sizeof( SimpleVertex ) * 6; //六个顶点
        bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
        bd.CPUAccessFlags = 0;
        D3D11_SUBRESOURCE_DATA InitData;
        ZeroMemory( &InitData, sizeof(InitData) );
        InitData.pSysMem = vertices;
        hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer );
        if( FAILED( hr ) )
        return hr;
        // Set vertex buffer
        UINT stride = sizeof( SimpleVertex );
        UINT offset = 0;
        g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );


        IP属地:四川5楼2013-11-28 15:40
        回复
          // Create index buffer
          WORD indices[] =
          {
          0,1,5,
          5,1,3,
          1,2,3,
          3,4,5,
          };
          bd.Usage = D3D11_USAGE_DEFAULT;
          bd.ByteWidth = sizeof( WORD ) * 12; //4个三角形要12个顶点
          bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
          bd.CPUAccessFlags = 0;
          InitData.pSysMem = indices;
          hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pIndexBuffer );
          if( FAILED( hr ) )
          return hr;
          // Set index buffer
          g_pImmediateContext->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0 );
          // Set primitive topology
          g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
          return S_OK;


          IP属地:四川6楼2013-11-28 15:45
          回复
            这句话就是用来画索引(共12顶点)
            g_pImmediateContext->DrawIndexed( 12, 0, 0 );


            IP属地:四川7楼2013-11-28 15:51
            回复
              Tutorial03.fx.文件如下:
              //
              // Copyright (c) Microsoft Corporation. All rights reserved.
              //--------------------------------------------------------------------------------------
              //--------------------------------------------------------------------------------------
              // Vertex Shader
              //--------------------------------------------------------------------------------------
              float4 VS( float4 Pos : POSITION ) : SV_POSITION
              {
              return Pos;
              }
              //--------------------------------------------------------------------------------------
              // Pixel Shader
              //--------------------------------------------------------------------------------------
              float4 PS( float4 Pos : SV_POSITION ) : SV_Target
              {
              return float4( 0.0f, 1.0f, 1.0f, 1.0f ); // 这个设置多边形内部颜色
              把这个文件拷贝到工程目录下


              IP属地:四川8楼2013-11-28 16:10
              回复
                //--------------------------------------------------------------------------------------
                // File: Tutorial03.cpp
                //
                // This application displays a triangle using Direct3D 11
                //
                // Copyright (c) Microsoft Corporation. All rights reserved.
                //--------------------------------------------------------------------------------------
                #include <windows.h>
                #include <d3d11.h>
                #include <d3dx11.h>
                #include <d3dcompiler.h>
                #include <xnamath.h>
                #include "resource.h"
                //--------------------------------------------------------------------------------------
                // Structures
                //--------------------------------------------------------------------------------------
                struct SimpleVertex
                {
                XMFLOAT3 Pos;
                };
                //--------------------------------------------------------------------------------------
                // Global Variables
                //--------------------------------------------------------------------------------------
                HINSTANCE g_hInst = NULL;
                HWND g_hWnd = NULL;
                D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL;
                D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0;
                ID3D11Device* g_pd3dDevice = NULL;
                ID3D11DeviceContext* g_pImmediateContext = NULL;
                IDXGISwapChain* g_pSwapChain = NULL;
                ID3D11RenderTargetView* g_pRenderTargetView = NULL;
                ID3D11VertexShader* g_pVertexShader = NULL;
                ID3D11PixelShader* g_pPixelShader = NULL;
                ID3D11InputLayout* g_pVertexLayout = NULL;
                ID3D11Buffer* g_pVertexBuffer = NULL;
                ID3D11Buffer* g_pIndexBuffer = NULL;
                //--------------------------------------------------------------------------------------
                // Forward declarations
                //--------------------------------------------------------------------------------------
                HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow );
                HRESULT InitDevice();
                void CleanupDevice();
                LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
                void Render();
                //--------------------------------------------------------------------------------------
                // Entry point to the program. Initializes everything and goes into a message processing
                // loop. Idle time is used to render the scene.
                //--------------------------------------------------------------------------------------
                int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
                {
                UNREFERENCED_PARAMETER( hPrevInstance );
                UNREFERENCED_PARAMETER( lpCmdLine );
                if( FAILED( InitWindow( hInstance, nCmdShow ) ) )
                return 0;
                if( FAILED( InitDevice() ) )
                {
                CleanupDevice();
                return 0;
                }
                // Main message loop
                MSG msg = {0};
                while( WM_QUIT != msg.message )
                {
                if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
                {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
                }
                else
                {
                Render();
                }
                }
                CleanupDevice();
                return ( int )msg.wParam;
                }
                //--------------------------------------------------------------------------------------
                // Register class and create window
                //--------------------------------------------------------------------------------------
                HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow )
                {
                // Register class
                WNDCLASSEX wcex;
                wcex.cbSize = sizeof( WNDCLASSEX );
                wcex.style = CS_HREDRAW | CS_VREDRAW;
                wcex.lpfnWndProc = WndProc;
                wcex.cbClsExtra = 0;
                wcex.cbWndExtra = 0;
                wcex.hInstance = hInstance;
                wcex.hIcon = LoadIcon( hInstance, ( LPCTSTR )IDI_TUTORIAL1 );
                wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
                wcex.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
                wcex.lpszMenuName = NULL;
                wcex.lpszClassName = L"TutorialWindowClass";
                wcex.hIconSm = LoadIcon( wcex.hInstance, ( LPCTSTR )IDI_TUTORIAL1 );
                if( !RegisterClassEx( &wcex ) )
                return E_FAIL;
                // Create window
                g_hInst = hInstance;
                RECT rc = { 0, 0, 1280, 960 };
                AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
                g_hWnd = CreateWindow( L"TutorialWindowClass", L"Direct3D 11 Tutorial 3: Shaders",
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hInstance,
                NULL );
                if( !g_hWnd )
                return E_FAIL;
                ShowWindow( g_hWnd, nCmdShow );
                return S_OK;
                }


                IP属地:四川9楼2013-11-28 16:20
                回复
                  2025-11-19 02:37:55
                  广告
                  不感兴趣
                  开通SVIP免广告
                  HRESULT CompileShaderFromFile( WCHAR* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob** ppBlobOut )
                  {
                  HRESULT hr = S_OK;
                  DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
                  #if defined( DEBUG ) || defined( _DEBUG )
                  // Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
                  // Setting this flag improves the shader debugging experience, but still allows
                  // the shaders to be optimized and to run exactly the way they will run in
                  // the release configuration of this program.
                  dwShaderFlags |= D3DCOMPILE_DEBUG;
                  #endif
                  ID3DBlob* pErrorBlob;
                  hr = D3DX11CompileFromFile( szFileName, NULL, NULL, szEntryPoint, szShaderModel,
                  dwShaderFlags, 0, NULL, ppBlobOut, &pErrorBlob, NULL );
                  if( FAILED(hr) )
                  {
                  if( pErrorBlob != NULL )
                  OutputDebugStringA( (char*)pErrorBlob->GetBufferPointer() );
                  if( pErrorBlob ) pErrorBlob->Release();
                  return hr;
                  }
                  if( pErrorBlob ) pErrorBlob->Release();
                  return S_OK;
                  }


                  IP属地:四川10楼2013-11-28 16:22
                  回复
                    //--------------------------------------------------------------------------------------
                    // Create Direct3D device and swap chain
                    //--------------------------------------------------------------------------------------
                    HRESULT InitDevice()
                    {
                    HRESULT hr = S_OK;
                    RECT rc;
                    GetClientRect( g_hWnd, &rc );
                    UINT width = rc.right - rc.left;
                    UINT height = rc.bottom - rc.top;
                    UINT createDeviceFlags = 0;
                    #ifdef _DEBUG
                    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
                    #endif
                    D3D_DRIVER_TYPE driverTypes[] =
                    {
                    D3D_DRIVER_TYPE_HARDWARE,
                    D3D_DRIVER_TYPE_WARP,
                    D3D_DRIVER_TYPE_REFERENCE,
                    };
                    UINT numDriverTypes = ARRAYSIZE( driverTypes );
                    D3D_FEATURE_LEVEL featureLevels[] =
                    {
                    D3D_FEATURE_LEVEL_11_0,
                    D3D_FEATURE_LEVEL_10_1,
                    D3D_FEATURE_LEVEL_10_0,
                    };
                    UINT numFeatureLevels = ARRAYSIZE( featureLevels );
                    DXGI_SWAP_CHAIN_DESC sd;
                    ZeroMemory( &sd, sizeof( sd ) );
                    sd.BufferCount = 1;
                    sd.BufferDesc.Width = width;
                    sd.BufferDesc.Height = height;
                    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
                    sd.BufferDesc.RefreshRate.Numerator = 60;
                    sd.BufferDesc.RefreshRate.Denominator = 1;
                    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
                    sd.OutputWindow = g_hWnd;
                    sd.SampleDesc.Count = 1;
                    sd.SampleDesc.Quality = 0;
                    sd.Windowed = TRUE;
                    for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
                    {
                    g_driverType = driverTypes[driverTypeIndex];
                    hr = D3D11CreateDeviceAndSwapChain( NULL, g_driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels,
                    D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext );
                    if( SUCCEEDED( hr ) )
                    break;
                    }
                    if( FAILED( hr ) )
                    return hr;
                    // Create a render target view
                    ID3D11Texture2D* pBackBuffer = NULL;
                    hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
                    if( FAILED( hr ) )
                    return hr;
                    hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );
                    pBackBuffer->Release();
                    if( FAILED( hr ) )
                    return hr;
                    g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
                    // Setup the viewport
                    D3D11_VIEWPORT vp;
                    vp.Width = (FLOAT)width;
                    vp.Height = (FLOAT)height;
                    vp.MinDepth = 0.0f;
                    vp.MaxDepth = 1.0f;
                    vp.TopLeftX = 0;
                    vp.TopLeftY = 0;
                    g_pImmediateContext->RSSetViewports( 1, &vp );
                    // Compile the vertex shader
                    ID3DBlob* pVSBlob = NULL;
                    hr = CompileShaderFromFile( L"Tutorial03.fx", "VS", "vs_4_0", &pVSBlob );
                    if( FAILED( hr ) )
                    {
                    MessageBox( NULL,
                    L"The FX file cannot be compiled. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK );
                    return hr;
                    }


                    IP属地:四川11楼2013-11-28 16:23
                    回复
                      // Create the vertex shader
                      hr = g_pd3dDevice->CreateVertexShader( pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &g_pVertexShader );
                      if( FAILED( hr ) )
                      {
                      pVSBlob->Release();
                      return hr;
                      }
                      // Define the input layout
                      D3D11_INPUT_ELEMENT_DESC layout[] =
                      {
                      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
                      };
                      UINT numElements = ARRAYSIZE( layout );
                      // Create the input layout
                      hr = g_pd3dDevice->CreateInputLayout( layout, numElements, pVSBlob->GetBufferPointer(),
                      pVSBlob->GetBufferSize(), &g_pVertexLayout );
                      pVSBlob->Release();
                      if( FAILED( hr ) )
                      return hr;
                      // Set the input layout
                      g_pImmediateContext->IASetInputLayout( g_pVertexLayout );
                      // Compile the pixel shader
                      ID3DBlob* pPSBlob = NULL;
                      hr = CompileShaderFromFile( L"Tutorial03.fx", "PS", "ps_4_0", &pPSBlob );
                      if( FAILED( hr ) )
                      {
                      MessageBox( NULL,
                      L"The FX file cannot be compiled. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK );
                      return hr;
                      }
                      // Create the pixel shader
                      hr = g_pd3dDevice->CreatePixelShader( pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), NULL, &g_pPixelShader );
                      pPSBlob->Release();
                      if( FAILED( hr ) )
                      return hr;
                      // Create vertex buffer
                      SimpleVertex vertices[] =
                      {
                      XMFLOAT3( -0.5f, 0.25f, 0.0f ), // 顶点0
                      XMFLOAT3( 0.0f, 0.5f, 0.0f), // 顶点1
                      XMFLOAT3(0.5f, 0.25f, 0.0f ), // 顶点2
                      XMFLOAT3( 0.5f, -0.25f, 0.0f ), // 顶点3
                      XMFLOAT3( 0.0f, -0.5f, 0.0f ), // 顶点4
                      XMFLOAT3( -0.5f, -0.25f, 0.0f ), // 顶点5
                      };
                      D3D11_BUFFER_DESC bd;
                      ZeroMemory( &bd, sizeof(bd) );
                      bd.Usage = D3D11_USAGE_DEFAULT;
                      bd.ByteWidth = sizeof( SimpleVertex ) * 6;
                      bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
                      bd.CPUAccessFlags = 0;
                      D3D11_SUBRESOURCE_DATA InitData;
                      ZeroMemory( &InitData, sizeof(InitData) );
                      InitData.pSysMem = vertices;
                      hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer );
                      if( FAILED( hr ) )
                      return hr;
                      // Set vertex buffer
                      UINT stride = sizeof( SimpleVertex );
                      UINT offset = 0;
                      g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );
                      // Create index buffer
                      WORD indices[] =
                      {
                      0,1,5,
                      5,1,3,
                      1,2,3,
                      3,4,5,
                      };
                      bd.Usage = D3D11_USAGE_DEFAULT;
                      bd.ByteWidth = sizeof( WORD ) * 12; // 36 vertices needed for 12 triangles in a triangle list
                      bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
                      bd.CPUAccessFlags = 0;
                      InitData.pSysMem = indices;
                      hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pIndexBuffer );
                      if( FAILED( hr ) )
                      return hr;
                      // Set index buffer
                      g_pImmediateContext->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0 );
                      // Set primitive topology
                      g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
                      return S_OK;
                      }


                      IP属地:四川12楼2013-11-28 16:23
                      回复
                        void CleanupDevice()
                        {
                        if( g_pImmediateContext ) g_pImmediateContext->ClearState();
                        if( g_pVertexBuffer ) g_pVertexBuffer->Release();
                        if( g_pVertexLayout ) g_pVertexLayout->Release();
                        if( g_pVertexShader ) g_pVertexShader->Release();
                        if( g_pPixelShader ) g_pPixelShader->Release();
                        if( g_pRenderTargetView ) g_pRenderTargetView->Release();
                        if( g_pSwapChain ) g_pSwapChain->Release();
                        if( g_pImmediateContext ) g_pImmediateContext->Release();
                        if( g_pd3dDevice ) g_pd3dDevice->Release();
                        }
                        //--------------------------------------------------------------------------------------
                        // Called every time the application receives a message
                        //--------------------------------------------------------------------------------------
                        LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
                        {
                        PAINTSTRUCT ps;
                        HDC hdc;
                        switch( message )
                        {
                        case WM_PAINT:
                        hdc = BeginPaint( hWnd, &ps );
                        EndPaint( hWnd, &ps );
                        break;
                        case WM_DESTROY:
                        PostQuitMessage( 0 );
                        break;
                        default:
                        return DefWindowProc( hWnd, message, wParam, lParam );
                        }
                        return 0;
                        }
                        //--------------------------------------------------------------------------------------
                        // Render a frame
                        //--------------------------------------------------------------------------------------
                        void Render()
                        {
                        // Clear the back buffer
                        float ClearColor[4] = { 1.0f, 0.0f, 0.0f, 1.0f }; // red,green,blue,alpha
                        g_pImmediateContext->ClearRenderTargetView( g_pRenderTargetView, ClearColor );
                        g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
                        g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );
                        g_pImmediateContext->DrawIndexed( 12, 0, 0 );
                        // Present the information rendered to the back buffer to the front buffer (the screen)
                        g_pSwapChain->Present( 0, 0 );
                        }


                        IP属地:四川13楼2013-11-28 16:24
                        回复
                          把 RECT rc = { 0, 0, 600, 600 };
                          设置成这样,运行结果


                          IP属地:四川14楼2013-11-28 16:29
                          回复