.[ ČeskéHry.cz ].
Single channel float texture and FBO

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 6. duben 2010, 17:40:50    Předmět: Single channel float texture and FBO Odpovědět s citátem

Zdravim,

v OpenGL nemam este vela skusenosti tak by som potreboval poradit. Najskor uvediem co vlastne programujem. Mam rozsiahlu scenu. Postupne tuto scenu, v ktorej sa nachadza nejaky mesh rezem rovnobeznymi rovinami. Po orezani sceny rovinou dostanem vertexy a pre kazdy vertex jednu float hodnotu - ide o skalar z roznych priemyselnych merani. Tieto vertexy a ich float hodnoty chcem vykreslit do float textury. Pouzivam renderovanie do textury pomocou FBO. Chcem, aby sa jednotlive namerane float hodnoty v texture ulozili skutocne ako float hodnoty a nie v intervale <0,1>. Ako mam nastavit 1 - kanalovu float texturu ? Islo by to takto:

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE32F_ARB, fboWidth, fboHeight, 0, GL_LUMINANCE, GL_FLOAT, 0);

Dozvedel som sa vsak, ze FBO nevie pracovat s texturou fo formate GL_LUMINANCE.

Druhy problem mam, ako vobec dostat tie per vertex hodnoty do OpenGL pipeline. Chcel som to riesit tak, ze puzijem glColorPointer. Tu mam vsak problem ten, ze tato funkcia chce 3, resp. 4 komponenty per color. Ja potrebujem len jednu. Da sa vobec nejako nastavit, aby som vuzival len jeden kanal pre farbu ? Asi cez glColorMask(), nie ? A ked nastavim, ze chcem napr. len zlozku RED aktivnu, to bude OpenGL renderovat do tej 1 kanalovej float textury pripojenej k FBO len jeden kanal ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 6. duben 2010, 17:59:19    Předmět: Odpovědět s citátem

mozes pouzit GL_R32F glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F_ARB, fboWidth, fboHeight, 0, GL_RED, GL_FLOAT, 0);

a pri renderovani do jednokanalovej textury by sa mala ukladat len cervena farba. ostatne farby su ignorovane.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 6. duben 2010, 18:12:29    Předmět: Odpovědět s citátem

nou napsal:
mozes pouzit GL_R32F glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F_ARB, fboWidth, fboHeight, 0, GL_RED, GL_FLOAT, 0);

a pri renderovani do jednokanalovej textury by sa mala ukladat len cervena farba. ostatne farby su ignorovane.


GL_R32F_ARB ? Taky format existuje ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 6. duben 2010, 18:23:54    Předmět: Odpovědět s citátem

samozrejme http://www.opengl.org/registry/specs/ARB/texture_rg.txt - pridava GL_R a GL_RG formaty textur
http://www.opengl.org/registry/specs/ARB/texture_float.txt - samotne float textury. jak 16 tak 32 bitov
http://www.opengl.org/registry/specs/ARB/framebuffer_object.txt - a este samotne FBO
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 6. duben 2010, 19:38:57    Předmět: Odpovědět s citátem

nou napsal:
samozrejme http://www.opengl.org/registry/specs/ARB/texture_rg.txt - pridava GL_R a GL_RG formaty textur
http://www.opengl.org/registry/specs/ARB/texture_float.txt - samotne float textury. jak 16 tak 32 bitov
http://www.opengl.org/registry/specs/ARB/framebuffer_object.txt - a este samotne FBO


dik, to som potreboval
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 6. duben 2010, 19:47:27    Předmět: Odpovědět s citátem

Teraz este k druhemu problemu - per vertex floaty. Mam takuto strukturu:

struct Color
{
public:
//Variables
float c1, c2, c3;

//Constructors
inline Color(void) : c1(0.0f), c2(0.0f), c3(0.0f) {}
inline Color(float nx, float ny, float nz) : c1(nx), c2(ny), c3(nz) {}
};

+ mam pole float hodnot pre kazdy vertex. Ked pouzijem glColorPointer(3, GL_FLOAT, sizeof(Color), colors) tak pipeline naozaj ulozi do 1 - kanalovej textury v kanali RED danu float hodnotu ? V podstate ja ani nechem mat c1, c2, c3 v tej strukture, stacilo by iba c1 (mam totiz iba jednu float hodnotu per vertex), lenze glColorPointer chce silou mocou minimalne 3 kanaly pre farbu. Cize asi zbytocne posielam tri rovnake hodnoty per vertex aj ked sa nakoniec pouzije iba jedna. Alebo sa to da nejako vyriesit pomocou glColorMask ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 7. duben 2010, 01:52:16    Předmět: Re: Single channel float texture and FBO Odpovědět s citátem

KuboSVK napsal:
Dozvedel som sa vsak, ze FBO nevie pracovat s texturou fo formate GL_LUMINANCE.

Od ARB_fbo je to povoleno, přesto radši zkontroluj FBO status.

Na druhý problém by pomohly shadery, resp. to API pak umožňuje jedno-komponentový atribut vertexu. Jinak teď nevím. U RED textury se ostatní kanály ignorují. glColorMask je úplně něco jinýho a tady je to zbytečný.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 8. duben 2010, 23:07:52    Předmět: Odpovědět s citátem

Tak nakoniec s tym druhym problemom mi pomohli prikazy z API OpenGL:

glVertexAttrib
glEnableVertexAttribArray
glVertexAttribPointer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 19. duben 2010, 22:38:33    Předmět: Odpovědět s citátem

tak som tu opat s problebom, ktory suvisi s vyssie uvedenym

Ako som uz v mojom prvom prispevku spominal, chcem renderovat cez FBO a float texturu k nemu pripojenu do tejto textury float hodnoty.

tu je moj kod:

kód:

// create a texture objects
   glPixelStorei(GL_UNPACK_ALIGNMENT,1);

   glGenTextures(3, textures);

   // textura pre renderovanie sliceov
   glBindTexture(GL_TEXTURE_2D, textures[0]);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, SliceManager::getInstance()->textureWidth, SliceManager::getInstance()->textureHeight, 0, GL_RED, GL_FLOAT, 0);
   glBindTexture(GL_TEXTURE_2D, 0);
   
   checkGLError("Float textura nastavena v poriadku !\n");

// create FBO and link texture and depth buffer as render buffer
   glGenFramebuffersEXT(1, &fbo);
   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
      
   glGenRenderbuffersEXT(1, &rbo);
   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rbo);
   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, SliceManager::getInstance()->textureWidth, SliceManager::getInstance()->textureHeight);
   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);

   // attach a texture to FBO color attachement point
   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, textures[0], 0);

   // attach a renderbuffer to depth attachment point
   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rbo);

   bool status = checkFBOStatus();

// unbind FBO for this time
   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);


tym som vytvoril FBO a prilinkoval k nemu 2d float texturu

dalsi kod:

kód:

// povol vertex a attribute arrays
   glEnableClientState(GL_VERTEX_ARRAY);
   glEnableVertexAttribArray(shaderProgram->attributeLocation);

   glVertexPointer(3, GL_DOUBLE, sizeof(Point), (double *)points[GFT_TRIANGLE].front());
   glVertexAttribPointer(shaderProgram->attributeLocation, 1, GL_DOUBLE, GL_FALSE, sizeof(RESULTDATA_TYPE), (RESULTDATA_TYPE *)results[GFT_TRIANGLE].front());

   // uloz si nastavenia viewport a matice GL_PROJECTION
   glPushAttrib(GL_VIEWPORT_BIT);
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   
   // prisposob nastavenia viewport a projection matice rozmerom float textury pripojenej k FBO
   glViewport(0, 0, SliceManager::getInstance()->textureWidth, SliceManager::getInstance()->textureHeight);
    glLoadIdentity();
   gluPerspective(90.0f, (GLfloat)(SliceManager::getInstance()->textureWidth) / SliceManager::getInstance()->textureHeight, 0.1f, 500.0f);
   
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

   // nastav ciel renderovania do FBO
   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
   
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   shaderProgram->enable();
   
      // vycentruj model a scalni ho podla jeho rozmerov (podla najvacsieho rozmeru)
      glPushMatrix();
      BoundingBox& boundingBox = SliceManager::getInstance()->eM->GetMesh()->bbox;
      double d = 1.0f / boundingBox.Diagonal();
      glScaled(d, d, d);
      double centerPoint[3];
      boundingBox.Center(&centerPoint[0]);
      glTranslated(-centerPoint[0], -centerPoint[1], -centerPoint[2]);

      glDrawArrays(GL_TRIANGLES, 0, points[GFT_TRIANGLE].size());

      glPopMatrix();
   
   shaderProgram->disable();

   // renderuj opat do klasickeho window-system-provided framebuffera
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // unbind

   // uloz texturu, do ktorej sa vyrendroval obsah slicu, na disk
   SliceManager::getInstance()->saveTextureOnDisk(SLICE_TEXTURE, planeIndex);


v metode savetextureOnDisk pristupujem k 2d float texture:

kód:

glEnable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D, RayCastingEngine::getInstance()->textures[0]);
         glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_FLOAT, imgData);


Problem je v tom, ze imgData(teda data z float textury) obsahuje same nuly. Neviete, kde by mohol byt problem
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 20. duben 2010, 13:56:39    Předmět: Odpovědět s citátem

Sorry za OT, ale jakou verzi OpenGL používáš?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 20. duben 2010, 16:23:38    Předmět: Odpovědět s citátem

Poky napsal:
Sorry za OT, ale jakou verzi OpenGL používáš?


glGetString(GL_VERSION) vracia 3.1.0
grafiku mam GeForce 8800 GTX/PCI/SSE2
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
KuboSVK



Založen: 13. 03. 2008
Příspěvky: 40

PříspěvekZaslal: 20. duben 2010, 16:25:37    Předmět: Odpovědět s citátem

zazbudol som dat kod pre VS a FS

Vertex Shader:
kód:

attribute float result;
varying float value;

void main(void)
{
   value = result;
   
    gl_Position = ftransform();
}


Fragment Shader:

kód:

varying float value;

void main(void)
{
   gl_FragColor = vec4(value, 0.0, 0.0, 1.0);
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna