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: 6. duben 2010, 17:40:50 Předmět: Single channel float texture and FBO |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 6. duben 2010, 17:59:19 Předmět: |
|
|
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 |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 6. duben 2010, 18:12:29 Předmět: |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
|
Návrat nahoru |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 6. duben 2010, 19:38:57 Předmět: |
|
|
dik, to som potreboval |
|
Návrat nahoru |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 6. duben 2010, 19:47:27 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. duben 2010, 01:52:16 Předmět: Re: Single channel float texture and FBO |
|
|
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 |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 8. duben 2010, 23:07:52 Předmět: |
|
|
Tak nakoniec s tym druhym problemom mi pomohli prikazy z API OpenGL:
glVertexAttrib
glEnableVertexAttribArray
glVertexAttribPointer |
|
Návrat nahoru |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 19. duben 2010, 22:38:33 Předmět: |
|
|
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(¢erPoint[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 |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 20. duben 2010, 13:56:39 Předmět: |
|
|
Sorry za OT, ale jakou verzi OpenGL používáš? |
|
Návrat nahoru |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 20. duben 2010, 16:23:38 Předmět: |
|
|
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 |
|
 |
KuboSVK
Založen: 13. 03. 2008 Příspěvky: 40
|
Zaslal: 20. duben 2010, 16:25:37 Předmět: |
|
|
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 |
|
 |
|