játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5479
FZoli:    4893
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2526

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2195
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1654
syam:    1491
> 1 <
PeterPan - Tag | 2 hsz       Online status #212397   2019.05.12 23:33 GMT+1 óra  
Hálásan köszönöm a segítségeteket! Sikerült!

Elnézést, hogy nem formáztam utólag, csak addigra vettem észre a válaszokat, mikor már el voltam havazva.

   
Instalok - Tag | 603 hsz       Online status #212396   2019.05.09 09:18 GMT+1 óra  
Asylum cikkén kívül van egy vulkan-tutorial.com oldal is: https://vulkan-tutorial.com/
Ezen belül van egy VertexBuffer szekció: https://vulkan-tutorial.com/Vertex_buffers

Ha mondjuk van egy Vertex structod:
Kód:
struct Vertex
{
    float x, y, z;
    float nx, ny, nz;
    ubyte r, g, b, a;
};

Akkor először is ennek a structnak a mérete: (3+3) * sizeof(float) + 4 * sizeof(ubyte), azaz normál körülmények között 28 byte (megj.: vigyázni kell az esetleges alignmenttel és paddinggel). Ez lesz a "stride", ami azt mondja meg, hogy az egyik vertextől a következő vertexig mennyi bájtot kell odébblépni. Ha van egy ilyen structod, akkor viszont lazán lekérheted a méretét.

https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkVertexInputBindingDescription.html
Kód:
VkVertexInputBindingDescription d = { 0, sizeof(Vertex), VK_VERTEX_INPUT_RATE_VERTEX };


Ezek után ugye azt mondod meg, hogy az adott buffer(ek)ben melyik attribútum (location) milyen offseten található, és milyen formátumban van megadva.
Például a pozíció (x,y,z) a 0 offseten kezdődik (ott van a struct elején), és mivel 3db 4 byte-os (32 bites) floatról van szó, így annak a típusa VK_FORMAT_R32G32B32_SFLOAT
Az offset meg annyit mond meg, hogy egy adott vertexen belül az adott elem hol kezdődik. Például a normálvektor első komponense az nx, ami előtt ott van a pozíció (x,y,z), amiről tudjuk, hogy 3*sizeof(float), tehát 12 byte. Használható egyébként a c++ban elérhető offsetof()

https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkVertexInputAttributeDescription.html
+
https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkFormat.html
Kód:
VkVertexInputAttributeDescription desc[] = {
    { 0, 0, VK_FORMAT_R32G32B32_SFLOAT, offsetof(Vertex, x) }, // offset = 0
    { 1, 0, VK_FORMAT_R32G32B32_SFLOAT, offsetof(Vertex, nx) }, // offset = 0+12
    { 2, 0, VK_FORMAT_R8G8B8A8_UNORM, offsetof(Vertex, r) } // offset = 0+12+12
};

Idézet
VK_FORMAT_R8G8B8A8_UNORM specifies a four-component, 32-bit unsigned normalized format that has an 8-bit R component in byte 0, an 8-bit G component in byte 1, an 8-bit B component in byte 2, and an 8-bit A component in byte 3.


Illetve én is csak megerősíteni tudom, hogy tényleg lőj be egy validation layert, mert anélkül később nem nagyon tudsz majd boldogulni: https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Validation_layers

   
Asylum - Törzstag | 5479 hsz       Online status #212395   2019.05.09 08:15 GMT+1 óra  
formázd be lsz. kódot a [code] tag-gel; A vertex input layout-od ránézésre is rossznak tűnik, a sorrend location, binding, format, offset. Nálad az offset nincs kitöltve rendesen, 0, 12, 24 kellene legyen. Más: color-t nem vec4-ben szokás megadni, hanem ubyte4-ben (majd a driver elintézi, hogy a shaderben vec4-ként jelenjen meg.

A lent linkelt cikkemben leírtaknak megfelelően szedd le és használd a validation layereket, mert vulkánban keményen megszívod nélkülük.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
PeterPan - Tag | 2 hsz       Online status #212394   2019.05.06 20:10 GMT+1 óra  
Sziasztok!

Elnézést, hogy így felhozom a topikot. Kezdő vagyok a témában és megtettem magamnak azt a szívességet, hogy OpenGL helyett Vulkan-on kezdtem el tanulni a grafikát.

Jelen pillanatban van egy olyan problémám, hogy szeretnék a programomban meghatározott RGBA értékeket a shaderig eljuttatni, de mindig teljesen átlátszatlan, fehér értékeket lő be a shader, amiből felteszem, nem jut el az adat a GPU-ig.

Az adatokat egy nagy vektorban deklaráltam (x,y,z,nx,ny,nz,r,g,b,a).

A VkVertexInputBindingDescription struct a
{0, 10 * sizeof(float),VK_VERTEX_INPUT_RATE_VERTEX};
értékeket kapja, a VkVertexInputAttributeDescription struct array pedig a
{
{0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0},
{1, 0, VK_FORMAT_R32G32B32_SFLOAT, 0},
{2, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10 * sizeof(float)}
};

Az alábbi kódtól azt várnám, hogy a shaderben a layout(location = 0) helyen eltudom érni a pozíció adatokat (vec3), a layout(location = 1) helyen a per-vertex normál vektorokat (vec3), a layout(location = 2) helyen pedig a rgba értékeket (vec4). Ezzel szemben a rgba értékek konstans vec4(1.0)-nek tűnnek.

Tudna valaki ötlettel szolgálni, hogy merre induljak?

Ezt a hozzászólást PeterPan módosította (2019.05.06 21:32 GMT+1 óra, 40 nap)

   
Asylum - Törzstag | 5479 hsz       Online status #210349   2016.09.28 14:07 GMT+1 óra  
A kód javítva lett AMD kártyákra. A cikk hamarosan frissül a tanultakkal.
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
Seeting - Törzstag | 2306 hsz       Online status #210284   2016.09.15 12:24 GMT+1 óra  
Egy újabb remek olvasmány. Neki is látok ha lesz egy kis időm. Köszi!
   
Asylum - Törzstag | 5479 hsz       Online status #210258   2016.09.12 10:09 GMT+1 óra  
Elkészült...4 hónapos munka volt, látni fogjátok, hogy miért...

http://darthasylum.blog.hu/2016/09/12/vulkankitores_819

(ha kirakod a blogszemlére akkor légyszi ezt a linket rakd ki köszi)
C++ fordítóval és macival alszom
http://darthasylum.blog.hu/
   
> 1 <