DirectX
こんにちは、Directxの整理をされた方はいらっしゃいますか、DirectComputeは入っていますか?
DirectCompute — Википедия
- ru.wikipedia.org
Изначально DirectCompute был опубликован в составе DirectX 11, однако позже стал доступен и для DirectX 10 и DirectX 10.1. DirectCompute, впервые появившись в составе DirectX 11, стал одним из важнейших его нововведений, первой технологией в составе DirectX, предоставившей доступ к вычислениям общего назначения на графических процессорах...
OpenCLがあります。もっと簡単になるのではという疑念があります)。
一目瞭然、DirectComputeが必要な理由。
1)便利で効率的である。計算し、すぐにkanvasに出力することができます。OpenCLでgpuに計算を送り、kanvasに出力するために別のリクエストが必要で、pcieで送るのは長いです。
2) APIが異なると、タスクやGPUベンダによって性能が大きく異なる。そして、たくさんの中から選ぶことができるようになります。
3)言語の選択ができるようになります。hlslを知っていれば、openclを学ぶ必要はないのです。
4) 計算の記述と結果の出力が一つの言語で行えるので便利です。
5)ヒープ用。バーテックスもあればピクセルもあり、ジオメトリックなものまでありますが、コンピュテーショナルなものはないんです。
6)ほとんどすべての準備が整っている。DXはボルトオンで、シェーダーを追加するだけで、ゼロからクダを追加するわけではありません。
7)トレーニング用にこんな ものを作ってみたい。
8)そして、最も重要な こと。

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, программы на которой прекрасно запускаются и на более новых...
Aliaksandr Hryshyn:
OpenCLがあります。もっと簡単になるのではという疑念があります)。
OpenCLがあります。もっと簡単になるのではという疑念があります)。
Aliaksandr Hryshyn:
フォーラムを少し勘違いしている疑いもありますね。
フォーラムを少し勘違いしている疑いもありますね。
トピックを間違えている疑いもありますね。
最小限のコードと、通常のkanvasとの性能比較の試み(曲がった方法で、pcieバスのスコアを取得しました。)
#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(); }
ファイル:
Shaders.zip
1 kb

https://www.mql5.com/ru/forum/227736
シェーダーに転送される。最初の15秒はCPU上でソースコードを実行し、その後GPU版を実行します。
"Canvas.mqhファイルの配列m_pixels[]をprotected:から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(); }
ファイル:
shaders.zip
1 kb

取引の機会を逃しています。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索