Advertisement
BratokHR

Chams silhouette

Jun 23rd, 2016
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.10 KB | None | 0 0
  1. #define shader "ps_2_0\nmov oC0, c0"
  2. #define shader_silhouette "ps_2_0\ndef c0, 0.002, 0, 0, -0.002\ndef c1, 0, -0.002, -1, -0\ndcl t0.xy\ndcl_2d s0\ntexld r0, t0, s0\nadd r1.xy, t0, c0\nadd r2.xy, t0, c0.wzyx\nadd r3.xy, t0, c0.zxyw\nadd r4.xy, t0, c1\ntexld r1, r1, s0\ntexld r2, r2, s0\ntexld r3, r3, s0\ntexld r4, r4, s0\nadd r5.w, r1.y, r1.x\nadd r5.x, r1.z, r5.w\nadd r5.x, r1.w, r5.x\nadd r5.y, r0.y, r0.x\nadd r5.y, r0.z, r5.y\nadd r5.y, r0.w, r5.y\nmul r5.z, r5.y, r5.y\ncmp r5.z, -r5.z, c1.z, c1.w\ncmp r5.x, -r5.x, -c0.y, r5.z\ncmp r0, r5.x, r0, r1\nadd r1.x, r2.y, r2.x\nadd r1.x, r2.z, r1.x\nadd r1.x, r2.w, r1.x\ncmp r1.x, -r1.x, -c0.y, r5.z\ncmp r0, r1.x, r0, r2\nadd r1.x, r3.y, r3.x\nadd r1.x, r3.z, r1.x\nadd r1.x, r3.w, r1.x\ncmp r1.x, -r1.x, -c0.y, r5.z\ncmp r0, r1.x, r0, r3\nadd r1.x, r4.y, r4.x\nadd r1.x, r4.z, r1.x\nadd r1.x, r4.w, r1.x\ncmp r1.x, -r1.x, -c0.y, r5.z\ncmp r0, r1.x, r0, r4\ncmp r0, -r5.y, r0, c0.y\nmov oC0, r0"
  3. #define shader_glass "ps_2_0\ndef c0, 0.002, 0, 0, -0.002\ndef c1, 0.3, 0.200000003, 0, 0\ndef c2, 0, -0.002, -1, -0\ndcl t0.xy\ndcl_2d s0\ntexld r0, t0, s0\nmov r1.w, c1.x\nadd r2.xy, t0, c0\nadd r3.xy, t0, c0.wzyx\nadd r4.xy, t0, c0.zxyw\nadd r5.xy, t0, c2\ntexld r2, r2, s0\ntexld r3, r3, s0\ntexld r4, r4, s0\ntexld r5, r5, s0\nadd r6.w, r2.y, r2.x\nadd r6.x, r2.z, r6.w\nadd r2.w, r2.w, r6.x\nmov r1.xyz, r2\nadd r2.x, r0.y, r0.x\nadd r2.x, r0.z, r2.x\nadd r2.x, r0.w, r2.x\nmul r2.x, r2.x, r2.x\ncmp r2.x, -r2.x, c2.z, c2.w\ncmp r2.y, -r2.w, -c0.y, r2.x\ncmp r1, r2.y, r0, r1\nmov r6.w, c1.x\nadd r0.x, r3.y, r3.x\nadd r0.x, r3.z, r0.x\nadd r3.w, r3.w, r0.x\nmov r6.xyz, r3\ncmp r0.x, -r3.w, -c0.y, r2.x\ncmp r1, r0.x, r1, r6\nmov r3.w, c1.x\nadd r0.x, r4.y, r4.x\nadd r0.x, r4.z, r0.x\nadd r4.w, r4.w, r0.x\nmov r3.xyz, r4\ncmp r0.x, -r4.w, -c0.y, r2.x\ncmp r1, r0.x, r1, r3\nmov r3.w, c1.x\nadd r0.x, r5.y, r5.x\nadd r0.x, r5.z, r0.x\nadd r5.w, r5.w, r0.x\nmov r3.xyz, r5\ncmp r0.x, -r5.w, -c0.y, r2.x\ncmp r1, r0.x, r1, r3\ncmp r1.w, -r0.w, r1.w, c1.y\nmov oC0, r1"
  4.  
  5. IDirect3DPixelShader9 *pixelshader;                // Шейдер для заливки игроков
  6. IDirect3DSurface9 *rendersurface;                // Плоскость для рисования
  7. IDirect3DTexture9 *sil_texture;                    // Сама текстура, в ней будут нарисованы сами игроки
  8. IDirect3DPixelShader9 *sil_ps;                    // Шейдер силуэта
  9. IDirect3DVertexBuffer9 *sil_vertex;                // Вершинный буфер
  10. D3DVIEWPORT9 viewport;                            // Размеры экрана
  11.  
  12. struct D3DTLVERTEX
  13. {
  14.     float x,y,z,w;
  15.     float tu,tv;
  16. };
  17.  
  18. void Generate( LPDIRECT3DDEVICE9 pDevice )
  19. {
  20.     LPD3DXBUFFER pshader = NULL;
  21.  
  22.     // Создание шейдера для заливки
  23.     if(D3DXAssembleShader(shader, strlen(shader), 0, 0, 0, &pshader, 0) == D3D_OK)
  24.         pDevice->CreatePixelShader((DWORD*)pshader->GetBufferPointer(), &pixelshader);
  25.  
  26.     pshader = NULL;
  27.  
  28.     // Создание шейдера силуэта
  29.     if(D3DXAssembleShader(shader_glass, strlen(shader_glass), 0, 0, 0, &pshader, 0) == D3D_OK)
  30.         pDevice->CreatePixelShader((DWORD*)pshader->GetBufferPointer(), &sil_ps);
  31.  
  32.     // Создание текстуры / интерфейса
  33.     pDevice->CreateTexture(viewport.Width,viewport.Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &sil_texture, NULL);
  34.     sil_texture->GetSurfaceLevel(0, &rendersurface);
  35.  
  36.     // Создание буфера вершин
  37.     pDevice->CreateVertexBuffer(sizeof(D3DTLVERTEX)*4, 0, (D3DFVF_XYZRHW|D3DFVF_TEX1), D3DPOOL_MANAGED, &sil_vertex, NULL);
  38. }
  39.  
  40. void DrawTexture(LPDIRECT3DDEVICE9 pDevice)
  41. {
  42.     /**
  43.      * Создание вершинного буфера
  44.      * Для подробной информации что к чему, можно почитать книгу "Фленов М.Е. 2006г. DirectX и C++. Искусство программирования." (5 глава - 3D эффекты)
  45.      * Там подробно описывается каждое действие
  46.      *
  47.      * Если коротко, то мы создаем 2 полигона (2 треугольника):
  48.             Vertex[0]       Vertex[2]
  49.             *----------------*
  50.             |               /|
  51.             |              / |
  52.             |             /  |
  53.             |            /   |
  54.             |           /    |
  55.             |          /     |
  56.             |         /      |
  57.             |        /       |
  58.             |       /        |
  59.             |      /         |
  60.             |     /          |
  61.             |    /           |
  62.             |   /            |
  63.             |  /             |
  64.             | /              |
  65.             |/               |
  66.             *----------------*
  67.             Vertex[3]       Vertex[4]
  68.      */
  69.     D3DTLVERTEX Vertex[4] = { { 0, 0, 0, 1, 0, 0 }, { viewport.Width, 0, 0, 1, 1, 0 }, { 0, viewport.Height, 0, 1, 0, 1 }, { viewport.Width, viewport.Height, 0, 1, 1, 1 } };
  70.  
  71.     void *pVertexBuffer = NULL;
  72.     sil_vertex->Lock(0, sizeof(D3DTLVERTEX)*4, &pVertexBuffer, 0);
  73.     memcpy(pVertexBuffer, Vertex, sizeof(D3DTLVERTEX)*4);
  74.     sil_vertex->Unlock();
  75.  
  76.     IDirect3DPixelShader9 *old_ps;
  77.     DWORD dwFVF;
  78.     pDevice->GetPixelShader(&old_ps);
  79.     pDevice->GetFVF(&dwFVF);
  80.  
  81.     // Рисование текстуры с шейдером
  82.     pDevice->SetVertexShader(0);
  83.     pDevice->SetPixelShader(sil_ps);
  84.     pDevice->SetTexture(0, sil_texture);
  85.     pDevice->SetStreamSource(0,sil_vertex, 0, sizeof(D3DTLVERTEX));
  86.     pDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
  87.     pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP , 0, 2);
  88.  
  89.     pDevice->SetPixelShader(old_ps);
  90.     pDevice->SetFVF(dwFVF);
  91. }
  92.  
  93. HRESULT APIENTRY hEndScene( LPDIRECT3DDEVICE9 pDevice )
  94. {
  95.     static bool init = false;
  96.     if (!init) {
  97.         pDevice->GetViewport(&viewport);
  98.         // Создание объектов
  99.         Generate(pDevice);
  100.         init = true;
  101.     }
  102.  
  103.     // Рисование текстуры
  104.     DrawTexture(pDevice);
  105.  
  106.     _pEndScene(pDevice);
  107.  
  108.     // Очистка текстуры с модельками
  109.     IDirect3DSurface9 *oldrs;
  110.     pDevice->GetRenderTarget(0, &oldrs);
  111.     // Установка рендера в текстуру
  112.     pDevice->SetRenderTarget(0,rendersurface);
  113.  
  114.     D3DRECT rect = { 0, 0, viewport.Width, viewport.Height };
  115.     pDevice->Clear(1, &rect, (D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER), 0, 0, 0);  
  116.  
  117.     pDevice->SetRenderTarget(0, oldrs);
  118.  
  119.     return true;
  120. }
  121.  
  122. HRESULT APIENTRY hDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount)
  123. {
  124.     if (axis) {
  125.         IDirect3DSurface9 *oldrs;
  126.         IDirect3DPixelShader9 *oldps;
  127.         DWORD oldzenable;
  128.         float old_psv[4];
  129.         float vis[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  130.         float unvis[4] = { 0.0f, 1.0f, 1.0f, 1.0f };
  131.  
  132.         pDevice->GetRenderTarget(0, &oldrs);
  133.         pDevice->GetRenderState(D3DRS_ZENABLE, &oldzenable);
  134.         pDevice->GetPixelShaderConstantF(0, old_psv, 1);
  135.         pDevice->GetPixelShader(&oldps);
  136.  
  137.         // Установка рендера в текстуру
  138.         pDevice->SetRenderTarget(0, rendersurface);
  139.         pDevice->SetRenderState(D3DRS_ZENABLE,false);
  140.         pDevice->SetPixelShaderConstantF(0, unvis, 1);
  141.         pDevice->SetPixelShader(pixelshader);
  142.         _pDrawIndexedPrimitive(pDevice,PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
  143.  
  144.         pDevice->SetRenderState(D3DRS_ZENABLE, oldzenable);
  145.         pDevice->SetPixelShaderConstantF(0, vis, 1);
  146.         pDevice->SetPixelShader(pixelshader);
  147.         _pDrawIndexedPrimitive(pDevice,PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
  148.  
  149.         pDevice->SetRenderTarget(0, oldrs);
  150.         pDevice->SetPixelShaderConstantF(0, old_psv, 1);
  151.         pDevice->SetPixelShader(oldps);
  152.     }
  153.  
  154.     return _pDrawIndexedPrimitive(pDevice, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement