Lebegőpontos RGBA 3D textura

Lebegőpontos RGBA 3D textura
2010-10-11T23:18:00+02:00
2010-10-26T15:19:31+02:00
2022-11-19T15:10:42+01:00
Istu7
Szasztok

Fent akadtam egy problémán, amire már a gugli sem tudja a választ. A helyzet a következő:

Generálok egy 3Ds float tömböt, amit 3Ds texturaként adok át az OpenGL-nek. RGB adatokkal (n x 3 float)frankón működik is a dolog.

Azonban én szeretnék négy értéket tárolni voxelenként. Erre ugye ott van az RGBA.

Azonban ha átalakítom a float tömbömet n x 4-esre akkor hibás eredményt kapok. RGB-ben szép színátmentes a kockám, mig RGBA-ban piros, zöld, kék, s fekete színek váltogatják csak egymást...

Olyasmire gyanakszom, hogy valamiért RGB-ként értelmezi a RGBA tömbömet a GL. De nem jövök rá hogy miért.

Lehet hogy nem tudja az RGBA és GL_FLOAT kombinációt a GL (bár erre utaló infót nem találtam, inkább olyat, ahol ezt használják..)?

A
glTexImage3D
függvénynél az
internalFormat
paraméterénél kipróbáltam az összes létező értéket, de nem kaptam jó eredményt..

Persze lehetne külön tömben tárolni a 4. értéket, de az nem szép megoldás.. :)

A kód fontosabb részei ezek:
A float tömböm:
class Voxel { float data[4]; } class Volume { std::vector<Voxel> volume; }

Az inicializálás, és texturha feltöltés:
PIXELFORMATDESCRIPTOR pfd; ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.iLayerType = PFD_MAIN_PLANE; glGenTextures (1, &textureId); glBindTexture (GL_TEXTURE_3D, textureId); glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE); glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0); glPixelStorei(GL_PACK_ROW_LENGTH, 0); glPixelStorei(GL_PACK_SKIP_IMAGES, 0); glPixelStorei(GL_PACK_SKIP_ROWS, 0); glPixelStorei(GL_PACK_SKIP_PIXELS, 0); glPixelStorei(GL_PACK_ALIGNMENT, 4); glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE); glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, 0); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage3D (GL_TEXTURE_3D, 0, GL_RGBA32F_ARB, x, y, z, 0, GL_RGBA, GL_FLOAT, volume.Data ()); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP); glEnable(GL_TEXTURE_3D); glBindTexture(GL_TEXTURE_3D, m_textureId); glBegin(GL_QUADS); glTexCoord3f (0.0f, 0.0f, 0.0f); glVertex3f (0.0f, 0.0f, 0.0f); glTexCoord3f (0.0f, 1.0f, 0.0f); glVertex3f (0.0f, 1.0f, 0.0f); . . .


Azt a rakás
glPixelStorei
hívást már kínomban hintettem a kódba, de annyi, mint esze egy marék lepkének..

A videókari, amin futni kellene: NVIDIA Quadro FX 3400/4400
OpenGL 2.1
GKView szerint támogatja a float 32 texturákat..

Valaki találkozott már hasonló esettel? Szívesen veszek minden ötletet..

Istu
Mutasd a teljes hozzászólást!
Borzaszo dolgot kovettem el, egyszeruen elsiklottam azon teny felett, hogy a Voxel osztalyom nem csak a negy darab erteket tarolta, hanem en balga meg letaroltam egy unsigned ben a Voxel meretet, ami konstansan 4 volt. Aztan ezt a Voxelt taroltam a vektorban.. Nyomorult OpenGL jo hogy nem tudta ezt az adatot ertelmezni... Benneteket pedig felreinformaltam azzal, hogy az itt leirt Voxel definicio nem tartalmazza a hibat okozo adattagot..

Egy szo mint szaz, tamogatja a hardware a lebegopontos texturat, meg butabb videokartyakon is vigan elfut a progi..

Koszonom azert a hozzaszolasokat.
Mutasd a teljes hozzászólást!

  • Hi!

    A teximage utan glGetError nem jelez hibat?
    Elirast nem latok GL_RGBA32F_ARB, GL_RGBA stimmel, a z pedig pont ugy 2 hatvanya, mint az x meg az y.
    (es a driver ugye a legfrissebb, mert hat nem tul gyakori dolgot probalsz hasznalni)
    "mig RGBA-ban piros, zöld, kék, s fekete színek váltogatják csak egymást..." -> izgalmas effektnek tunik.
    Egyebet nem tudok mondani, kerem kapcsojjaki :D
    Mutasd a teljes hozzászólást!
  • Specifies the number of color components in the texture.
    Must be 1, 2, 3, or 4, or one of the following symbolic constants:
    GL_ALPHA,
    GL_ALPHA4,
    GL_ALPHA8,
    GL_ALPHA12,
    GL_ALPHA16,
    GL_COMPRESSED_ALPHA,
    GL_COMPRESSED_LUMINANCE,
    GL_COMPRESSED_LUMINANCE_ALPHA,
    GL_COMPRESSED_INTENSITY,
    GL_COMPRESSED_RGB,
    GL_COMPRESSED_RGBA,
    GL_LUMINANCE,
    GL_LUMINANCE4,
    GL_LUMINANCE8,
    GL_LUMINANCE12,
    GL_LUMINANCE16,
    GL_LUMINANCE_ALPHA,
    GL_LUMINANCE4_ALPHA4,
    GL_LUMINANCE6_ALPHA2,
    GL_LUMINANCE8_ALPHA8,
    GL_LUMINANCE12_ALPHA4,
    GL_LUMINANCE12_ALPHA12,
    GL_LUMINANCE16_ALPHA16,
    GL_INTENSITY,
    GL_INTENSITY4,
    GL_INTENSITY8,
    GL_INTENSITY12,
    GL_INTENSITY16,
    GL_R3_G3_B2,
    GL_RGB,
    GL_RGB4,
    GL_RGB5,
    GL_RGB8,
    GL_RGB10,
    GL_RGB12,
    GL_RGB16,
    GL_RGBA,
    GL_RGBA2,
    GL_RGBA4,
    GL_RGB5_A1,
    GL_RGBA8,
    GL_RGB10_A2,
    GL_RGBA12,
    GL_RGBA16,
    GL_SLUMINANCE,
    GL_SLUMINANCE8,
    GL_SLUMINANCE_ALPHA,
    GL_SLUMINANCE8_ALPHA8,
    GL_SRGB,
    GL_SRGB8,
    GL_SRGB_ALPHA, or
    GL_SRGB8_ALPHA8.

    Magyarul a kivant float32 texture tamogatasa nem kotelezo az opengl szabvany szerint 3D-s texturanal... (legalabbis ezt irja :p). Biztos, hogy tamogatott a float 3d-s textura a hardvereden ?
    Mutasd a teljes hozzászólást!
  • A Quadro fx 3400 az gef 6 alapú kártya, itt valószínűleg nincs támogatva a rgbafp32. 4400 helyett meg nem 4500-ra gondoltál (az pedig geforce 7 alapú, ott sem biztos hogy támogatott a 4 csatornás float textúra)?

    Javaslom szerezz be egy g80 alapú kártyát, ott biztosan támogatott. Ezek már nagyon régi cuccok...
    Mutasd a teljes hozzászólást!
  • Borzaszo dolgot kovettem el, egyszeruen elsiklottam azon teny felett, hogy a Voxel osztalyom nem csak a negy darab erteket tarolta, hanem en balga meg letaroltam egy unsigned ben a Voxel meretet, ami konstansan 4 volt. Aztan ezt a Voxelt taroltam a vektorban.. Nyomorult OpenGL jo hogy nem tudta ezt az adatot ertelmezni... Benneteket pedig felreinformaltam azzal, hogy az itt leirt Voxel definicio nem tartalmazza a hibat okozo adattagot..

    Egy szo mint szaz, tamogatja a hardware a lebegopontos texturat, meg butabb videokartyakon is vigan elfut a progi..

    Koszonom azert a hozzaszolasokat.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd