Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 31. říjen 2009, 00:58:29 Předmět: glTexImageXY |
|
|
Mam volumetricke data (CT ludskeho tela) ulozene na pravidelnej mriezke. Kazdy voxel (vrchol v danej mriezke) obsahuje celociselnu hodnotu v intervale 0..255, t.j. 1 byte. Tuto mriezku chcem reprezentovat pomocou 3D textury. Nasledne vo fragment shaderi z nej ziskavam dane hodnoty, s ktorymi dalej pracujem. Fragment shader mi vsak stale vracia hodnotu 0 pre lubovolny bod mriezky. Neviete, kde moze byt problem ? Som celkom novy v OpenGL. Stale mam problem s pochopenim vyznamu parametrov prikazu glTexImageXY - najma format a internalformat. Kod mam nasledovny:
FILE* fp = fopen(volumeFileName, "rb");
volumeData = new GLubyte[256*256*256]; // mriezka rozmerov 256*256*256
fread((void*)volumeData, sizeof(GLubyte), 256*256*256, fp);
fclose(fp);
glGenTextures(1, &volumeTexture);
glBindTexture(GL_TEXTURE_3D, volumeTexture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
glTexImage3D(GL_TEXTURE_3D, 0, GL_R, 256, 256, 256, 0, GL_R, GL_UNSIGNED_BYTE, volumeData);
Fragment shader:
value = texture3D(data, position); - stale vracia nulove hodnoty
Parameter position je urcite spravne.
Dik za radu |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 31. říjen 2009, 06:40:53 Předmět: |
|
|
GL_R rozhodně není správný parametr formátu.
InternalFormat určuje, jakého typu jsou pixely.
Format určuje, jaké tam jsou barevné kanály, tedy zejména jejich pořadí.
InternalFormat dáš jeden z těchto, podle toho, jak chceš interpretovat data:
- GL_R8: Při vzorkování (texture3D) normalizuje (dělí číslem 255) barvy pixelů do rozsahu <0, 1>.
- GL_R8_SNORM: (signed normalized) To samé, akorát dále hodnotu vynásobí dvěma a odečte 1, tj. dostaneš rozsah <-1, 1>.
- GL_R8UI: Vzorkování vrací původní 8bit unsigned integer hodnoty tj. <0, 255>, potřebuješ na to ale typ sampleru isampler3D.
- GL_R8I: To samé, akorát vrací signed integer tj. <-128, 127>.
Format nastavíš na GL_RED, tam jinou možnost nemáš.
Všechny varianty vyžadují buď OpenGL 3.0 nebo GL_ARB_texture_rg.
UI/I varianty vyžadují navíc buď OpenGL 3.0 nebo GL_EXT_texture_integer.
SNORM varianta vyžaduje navíc buď OpenGL 3.1 nebo GL_EXT_texture_snorm. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 31. říjen 2009, 09:57:23 Předmět: |
|
|
kontrolujes error cez glGetError()? to by sa malo volat aspon raz za jednu snimku aby sa vedelo ze je vsetko v poriadku.
ked sa dostanem ku kompu pastnem ti sem kod s fungujucim kodom. inak internal format mozes pouzit aj GL_LUMINANCE to iset aj pre format.
EDIT: moj kod na 3D texturu.
kód: |
glGenTextures(1, &textura);
glBindTexture(GL_TEXTURE_3D, textura);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, 256, 256, 256, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
_________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 31. říjen 2009, 23:43:59 Předmět: |
|
|
Nemohlo by to byt aj takto ?
glTexImage3D(GL_TEXTURE_3D, 0, 1, 256, 256, 256, 0, GL_RED, GL_UNSIGNED_BYTE, volumeData);
Ta jednotka ako 3. parameter udava, ze v datach je iba jeden color component. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 1. listopad 2009, 00:34:32 Předmět: |
|
|
hej mohlo. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
|