DirectX

 
Hi, has anyone sorted out directx yet, is there a DirectCompute in there ?
DirectCompute — Википедия
  • ru.wikipedia.org
Изначально DirectCompute был опубликован в составе DirectX 11, однако позже стал доступен и для DirectX 10 и DirectX 10.1. DirectCompute, впервые появившись в составе DirectX 11, стал одним из важнейших его нововведений, первой технологией в составе DirectX, предоставившей доступ к вычислениям общего назначения на графических процессорах...
 
There is OpenCL. I have a suspicion that it will be much easier).
 

At a quick glance, why DirectCompute is needed:

1) It's convenient and efficient. You can calculate and immediately output the result to kanvas. You need to send calculation to gpu via OpenCL, then another request for output to kanvas, and sending it via pcie is long.

2) Different api differ a lot in performance depending on the task and the gpu vendor. And there will be plenty to choose from.

3) There will be a choice of language. If one knows hlsl, he won't have to learn opencl.

4) Calculation and output the result can be written in one language, which is convenient.

5) For the heap. Vertex ones are there, pixel ones are there, even geometric ones are there, but computational ones are not.

6) Almost everything is ready for that. DX is bolted on, just need to add a shader, it's not adding kuda from scratch.

7) I want to make such a thing for training.

8) And most importantly.

GPU Particles с использованием Compute и Geometry шейдеров
GPU Particles с использованием Compute и Geometry шейдеров
  • habr.com
Привет, дорогой читатель! Сегодня мы продолжим изучение графического конвейера, и я расскажу о таких замечательных вещах, как Compute Shader и Geometry Shader на примере создания системы на 1000000+ частиц, которые в свою очередь являются не точками, а квадратами (billboard quads) и имеют свою текстуру. Другими словами, мы выведем 2000000+...
 
DirectX API. OpenGL или DirectX
  • Roman Shatalov - roman@shatalov.su
  • oldshatalov.ghost17.ru
В данном разделе расположены уроки по DirectX 9. Я выбрал именно девятую версию, так как считаю, что полный переход на новые версии Windows произойдёт ещё нескоро. А пока у большинства пользователей установлена операционная система Windows XP, лучше использовать библиотеку DirectX 9, программы на которой прекрасно запускаются и на более новых...
 

By shader12

Little by little 1 2

 
Aliaksandr Hryshyn:
There is OpenCL. I have a suspicion that it will be much easier).
 
Rorschach:
On shaders 1 2
There's a suspicion that you've got the forum a little wrong.
 
Aliaksandr Hryshyn:
There is a suspicion that you've got the forum a little wrong.

There is a suspicion that you've got the wrong topic.

 

Minimal code, plus an attempt to compare performance with a normal kanvas (crooked way, got pcie bus score)

#include <Canvas\Canvas.mqh>
#resource "/Files/vertex.hlsl" as string VS;
#resource "/Files/pixel.hlsl" as string PS;

struct VSInputVertex
  {
   float             position[4];
   static const DXVertexLayout s_layout[1];
  };
const DXVertexLayout VSInputVertex::s_layout[1]=
  {
     {"POSITION", 0, DX_FORMAT_R32G32B32A32_FLOAT }
  };

void OnStart()
  {
   int size=500;
   CCanvas cc;
   cc.CreateBitmapLabel("11",100,100,size,size);
   cc.Erase(ColorToARGB(clrGreen));
   cc.Update();
   Sleep(1000);
   VSInputVertex vertex[];
   ArrayResize(vertex,size*size);
   for(int y=0;y<size;y++)
     {for(int x=0;x<size;x++)
        {vertex[y*size+x].position[0]=2.f*(x+1)/size-1.f;
         vertex[y*size+x].position[1]=2.f*(y+1)/size-1.f;
         vertex[y*size+x].position[2]=0.5;
         vertex[y*size+x].position[3]=1.0;
        }
     }
   int hc=DXContextCreate(size,size);
   int hbv=DXBufferCreate(hc,DX_BUFFER_VERTEX,vertex);
   string s="";
   int hsv=DXShaderCreate(hc,DX_SHADER_VERTEX,VS,"main",s);
   int hsp=DXShaderCreate(hc,DX_SHADER_PIXEL ,PS,"main",s);
   DXShaderSetLayout(hsv,VSInputVertex::s_layout);
   DXPrimiveTopologySet(hc,DX_PRIMITIVE_TOPOLOGY_POINTLIST);
   DXBufferSet(hc,hbv);
   DXShaderSet(hc,hsv);
   DXShaderSet(hc,hsp);
   DXContextClearDepth(hc);
   DXDraw(hc);
   uint image[];
   ulong t1=GetMicrosecondCount();
   DXContextGetColors(hc,image);
   ulong t2=GetMicrosecondCount();
   for(int y=0;y<size;y++)
      for(int x=0;x<size;x++)
         cc.PixelSet(x,y,image[y*size+x]);
   ulong t3=GetMicrosecondCount();
   cc.Update();
   Print(t2-t1," ",t3-t2);
   Sleep(1000);
   DXRelease(hsp);
   DXRelease(hsv);
   DXRelease(hbv);
   DXRelease(hc);
   cc.Destroy();
  }
Files:
Shaders.zip  1 kb
 

https://www.mql5.com/ru/forum/227736

Transferred to shader. First 15 seconds runs source code on cpu, then runs gpu version.

"You need to move array m_pixels[] in Canvas.mqh file from protected: to public:"

#include <Canvas\Canvas.mqh>
#resource "/Files/vertex.hlsl" as string VS;
#resource "/Files/pixel.hlsl" as string PS;

struct VSInputVertex
  {float             position[4];
   static const DXVertexLayout s_layout[1];
  };
const DXVertexLayout VSInputVertex::s_layout[1]={{"POSITION", 0, DX_FORMAT_R32G32B32A32_FLOAT}};

struct PSInputBuffer
  {float             resolution[2];
   float             time;
   float             dummy;
  };

void OnStart()
  {CCanvas C;
   int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину окна
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна
   if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // создаем канвас размером текущего окна
   Print("Error creating canvas: ",GetLastError()); 
   //---CPU---
   uint i=0,j=100000;
   int size=Width*Height;
   uchar h[25600];
   for (int w=0;w<25600;w++) 
   h[w]= uchar(128+128*sin(double(w)/256));//создаем массив для ускорения работы
   double X1=0,Y1=0,X2=0,Y2=0;
   uint t0=GetTickCount();
   uint t1=0;
   while(!IsStopped())
     {int pos=int(i%size);
      if(pos==0)
        {C.TextOut(100,100,"CPU FPS: "+DoubleToString(1000./(GetTickCount()-t1),2),clrWhite);
         t1=GetTickCount();
         C.Update();
         if(t1-t0>15000) break;
         //Sleep(30);
         X1= Width-(sin((double)j/100)*(double)Width);
         Y1= Height-(cos((double)j/140)*(double)Height);
         X2= Width+(cos((double)j/80)*(double)Width);
         Y2= Height+(sin((double)j/20)*(double)Height);
         j++;
        }
      int X=pos%Width;
      int Y=int(pos/Width);
      double d= ((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y))/(((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y))+((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y)));
      C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);
      i++;
     }
   //---GPU---
   VSInputVertex vertex[]= {{{-1,-1,0.5,1.0}},{{-1,1,0.5,1.0}},{{1,1,0.5,1.0}},{{1,-1,0.5,1.0}}};
   int hc=DXContextCreate(Width,Height);
   int hbv=DXBufferCreate(hc,DX_BUFFER_VERTEX,vertex);
   uint index[]={0,1,2, 2,3,0};
   int hbi=DXBufferCreate(hc,DX_BUFFER_INDEX ,index );
   string s="";
   int hsv=DXShaderCreate(hc,DX_SHADER_VERTEX,VS,"main",s);
   int hsp=DXShaderCreate(hc,DX_SHADER_PIXEL ,PS,"main",s);
   int hi[1];
   hi[0]=DXInputCreate(hc,sizeof(PSInputBuffer));
   DXShaderInputsSet(hsp,hi);
   DXShaderSetLayout(hsv,VSInputVertex::s_layout);
   DXPrimiveTopologySet(hc,DX_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
   DXBufferSet(hc,hbv);
   DXBufferSet(hc,hbi);
   DXShaderSet(hc,hsv);
   DXShaderSet(hc,hsp);
   
   PSInputBuffer frame_data;
   frame_data.resolution[0]=(float)Width;
   frame_data.resolution[1]=(float)Height;
   for(uint n=100000;!IsStopped();n++)
     {DXContextClearDepth(hc);
      frame_data.time=(float)n;
      DXInputSet(hi[0],frame_data);
      DXDrawIndexed(hc);
      DXContextGetColors(hc,C.m_pixels);
      C.TextOut(100,100,"GPU FPS: "+DoubleToString(1000./(GetTickCount()-t1),2),clrWhite);
      C.Update();
      t1=GetTickCount();
     }
   
   DXRelease(hi[0]);
   DXRelease(hsp);
   DXRelease(hsv);
   DXRelease(hbv);
   DXRelease(hbi);
   DXRelease(hc);
   C.Destroy();
  }
Files:
shaders.zip  1 kb
Reason: