zoukankan      html  css  js  c++  java
  • Vertex Shader 入门代码

    /*
    This is a simple vertex shader program which illustrate how to use vertex shader instead of fixed pipeline
        to perform world, view and projection transform
    */
    
    #include <d3dx9.h> 
    #include <MMSystem.h>
    
    LPDIRECT3D9             g_pD3D                  = NULL ; // Used to create the D3DDevice 
    LPDIRECT3DDEVICE9       g_pd3dDevice            = NULL ; // Our rendering device 
    ID3DXMesh*              g_pMesh                 = NULL ; // Hold the sphere 
    
    
    // vertex shader declaration
    IDirect3DVertexShader9* g_pVertexShader         = NULL ; // vertex shader 
    ID3DXConstantTable*     g_pConstantTable        = NULL ; // shader constant table
    
    // Handle for world, view and projection matrix 
    // We use this variable to communicate between the effect file Shader.txt and the C++ code
    D3DXHANDLE ViewProjMatrixHanle = 0 ; 
    
    void SetupMatrix() ;
    bool PrepareShader() ;
    
    HRESULT InitD3D( HWND hWnd ) 
    { 
        // Create the D3D object, which is needed to create the D3DDevice. 
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) 
            return E_FAIL; 
    
        D3DPRESENT_PARAMETERS d3dpp;  
        ZeroMemory( &d3dpp, sizeof(d3dpp) ); 
        d3dpp.Windowed = TRUE; 
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; 
    
        // Create device 
        if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
            D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
            &d3dpp, &g_pd3dDevice ) ) ) 
        { 
            return E_FAIL; 
        } 
    
        // Turn off culling, so we see the front and back of the triangle    
        g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );    
    
        //g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);    
        g_pd3dDevice->SetRenderState( D3DRS_LIGHTING , FALSE );    
    
        // Create a teapot
        D3DXCreateTeapot(g_pd3dDevice, &g_pMesh, NULL) ; 
    
        // Prepare Shader
        PrepareShader() ;
    
        // Setup matrix
        SetupMatrix() ;
    
        return S_OK; 
    } 
    
    VOID Cleanup() 
    { 
        if( g_pd3dDevice != NULL)  
            g_pd3dDevice->Release(); 
    
        if( g_pD3D != NULL) 
            g_pD3D->Release(); 
    
        if(g_pMesh != NULL) 
            g_pMesh->Release() ; 
    } 
    
    bool PrepareShader() 
    { 
        // Buffer to hold the compiled code
        ID3DXBuffer* codeBuffer = NULL;
        // Buffer to hold the error message if compiled failed
        ID3DXBuffer* errorBuffer = NULL;
        // Compile shader from file
        HRESULT hr = D3DXCompileShaderFromFileA("vertexshader.txt", 0, 0, "Main",
            "vs_1_1", D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, &codeBuffer,
            &errorBuffer, &g_pConstantTable);
        // Output any error messages
        if(errorBuffer != NULL)
        {
            MessageBoxA(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
            errorBuffer->Release();
            return false;
        }
        if(FAILED(hr))
        {
            MessageBoxA(0, "D3DXCompileShaderFromFile() - FAILED", 0, 0);
            return false;
        }
        // Create vertex shader
        hr = g_pd3dDevice->CreateVertexShader((DWORD*)codeBuffer->GetBufferPointer(), &g_pVertexShader);
        // Handling error
        if(FAILED(hr))
        {
            MessageBoxA(0, "CreateVertexShader() - FAILED", 0, 0);
            return false;
        }
        // Release code buffer
        if(codeBuffer != NULL)
        {
            codeBuffer->Release();
            codeBuffer = NULL;
        }
        // Release error buffer
        if(errorBuffer != NULL)
        {
            errorBuffer->Release();
            errorBuffer = NULL;
        }
        // Set handle
        ViewProjMatrixHanle = g_pConstantTable->GetConstantByName(0, "gWVP");
        return true;
    } 
    
    void SetupMatrix() 
    { 
        D3DXVECTOR3 vEye(0.0f, 0.0f, -1.0f);
        D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f);
        D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
        // Set view matrix
        D3DXMATRIX matView;
        D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp);
        // Set projection matrix
        D3DXMATRIX matProj;
        D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI * 0.25f, 1.0f, 1.0f, 1000.0f);
        D3DXMATRIX matViewProj = matView * matProj;
        g_pConstantTable->SetMatrix(g_pd3dDevice, ViewProjMatrixHanle, &matViewProj);
        // this line is mandatory if you have used Constant table in your code
        g_pConstantTable->SetDefaults(g_pd3dDevice);
    }
    
    VOID Render() 
    { 
        // Clear the back-buffer to a red color
        g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0xffff0000, 1.0f, 0);
        // Begin the scene
        if(SUCCEEDED(g_pd3dDevice->BeginScene()))
        {
            // Set Vertex Shader
            g_pd3dDevice->SetVertexShader(g_pVertexShader);
            // Render teapot
            g_pMesh->DrawSubset(0);
            // Unset vertex shader
            g_pd3dDevice->SetVertexShader(NULL);
            // End the scene
            g_pd3dDevice->EndScene();
        }
        // Present the back-buffer content to the display
        g_pd3dDevice->Present(NULL, NULL, 0, NULL);
    } 
    
    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        switch( msg )
        {
        case WM_KEYDOWN:
            {
                switch( wParam )
                {
                case VK_ESCAPE:
                    SendMessage( hWnd, WM_CLOSE, 0, 0 );
                    break ;
                default:
                    break ;
                }
            }
            break ;
    
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;
        }
    
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
    
    INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR szCmdLine, int iCmdShow)
    {
        WNDCLASSEX winClass ;
    
        winClass.lpszClassName = L"Teapot";
        winClass.cbSize        = sizeof(WNDCLASSEX);
        winClass.style         = CS_HREDRAW | CS_VREDRAW;
        winClass.lpfnWndProc   = MsgProc;
        winClass.hInstance     = hInstance;
        winClass.hIcon           = NULL ;
        winClass.hIconSm       = NULL ;
        winClass.hCursor       = NULL ;
        winClass.hbrBackground = NULL ;
        winClass.lpszMenuName  = NULL ;
        winClass.cbClsExtra    = 0;
        winClass.cbWndExtra    = 0;
    
        RegisterClassEx (&winClass) ;  
    
        HWND hWnd = CreateWindowEx(NULL,  
            winClass.lpszClassName,        // window class name
            L"Teapot",                    // window caption
            WS_OVERLAPPEDWINDOW,         // window style
            0,                            // initial x position
            0,                            // initial y position
            500,                        // initial window width
            500,                        // initial window height
            NULL,                        // parent window handle
            NULL,                        // window menu handle
            hInstance,                    // program instance handle
            NULL) ;                        // creation parameters
    
        // Create window failed
        if(hWnd == NULL)
        {
            MessageBoxA(hWnd, "Create Window failed!", "Error", 0) ;
            return -1 ;
        }
    
        // Initialize Direct3D
        if( SUCCEEDED(InitD3D(hWnd)))
        { 
            // Show the window
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );
    
            // Enter the message loop
            MSG    msg ; 
            ZeroMemory( &msg, sizeof(msg) );
            PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
    
            // Get last time
            static DWORD lastTime = timeGetTime();
    
            while (msg.message != WM_QUIT)  
            {
                if( PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE) != 0)
                {
                    TranslateMessage (&msg) ;
                    DispatchMessage (&msg) ;
                }
                else // Render the game if there is no message to process
                {
                    // Get current time
                    DWORD currTime  = timeGetTime();
    
                    // Calculate time elapsed
                    float timeDelta = (currTime - lastTime)*0.001f;
    
                    // Render
                    Render() ;
    
                    // Update last time to current time for next loop
                    lastTime = currTime;
                }
            }
        }
    
        UnregisterClass(winClass.lpszClassName, hInstance) ;
        return 0;
    }

    http://www.cnblogs.com/graphics/archive/2010/08/13/1799200.html

    // World, View and Projection Matrix
    uniform extern float4x4 gWVP; 
    
    // Output Vertex structure
    struct OutputVS
    {
          float4 posH : POSITION0;
    };
    
    OutputVS Main(float3 posL : POSITION0)
    {
          // Zero out our output.
          OutputVS outVS = (OutputVS)0;
    
          // Transform to homogeneous clip space.
          outVS.posH = mul(float4(posL, 1.0f), gWVP);
    
          // Done--return the output.
          return outVS;
    }
  • 相关阅读:
    已知二叉树的前序遍历、中序遍历,求后序遍历
    排序算法
    应用层
    运输层
    mysql分页查询
    mysql 性能分析及explain用法
    数据库SQL优化
    MATLAB GUI设计(1)
    路径选择
    Python itchat库(1)
  • 原文地址:https://www.cnblogs.com/ketmales/p/2485417.html
Copyright © 2011-2022 走看看