.[ ČeskéHry.cz ].
Float textury na stařičké GF7150

 
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
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 10. květen 2011, 09:56:01    Předmět: Float textury na stařičké GF7150 Odpovědět s citátem

Zdar,

momentálně se snažím rozchodit GL_RGB16F_ARB s FBO (deferred render) a nějak se mi to nedaří, buďto dostanu že je framebuffer incomplete a nebo unsupported, ikdyž v listu podporovanejch extenzí je GL_ARB_texture_float kterej by měl podporovat aji GL_RGB(A)32F_ARB, na té dostanu že je unsupported. Předpokládám že normály do nějakýho GL_RGB8 formátu nedostanu, takže je jiný řešení než tu grafiku vzít a zahodit ? BTW ovladace mam nejake posledni vydane pro winXP 156.55 a víc už nevydali nejspíš ;D Asi chcu nemožný Very Happy

Eště kod:
kód:

   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOid);
   {
        {
           glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthRBO);
           glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, x, y);
           glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthRBO);
       
            glGenTextures(1, &depthMapID);
            glBindTexture(GL_TEXTURE_2D, depthMapID);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, x, y, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
           glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depthMapID, 0);
       
        }
       
        {
           glGenTextures(1, &colorMapID);
           glBindTexture(GL_TEXTURE_2D, colorMapID);
           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,  x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
           glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
           glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorMapID, 0); 
        }
       
       
        {
            glGenTextures(1, &normalMapID);
            glBindTexture(GL_TEXTURE_2D, normalMapID);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, x, y, 0, GL_RGB, GL_FLOAT, NULL);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
            glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, normalMapID, 0);

        }
    }
    GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
   
    if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
    {
      printf("FBO Error: %d\n", status);
      system("pause");
      return false;
   }


Jinak když to nacpu do klasickýho GL_RGB8 tak není problém a framebuffer funguje.
No idea.

EDIT, jeste kdyz nastavim na GL_RGBA16 ale nastavim ji GL_FLOAT tak to funguje ale, neignoruje se to jenom? nemám to jak vyzkoušet protože vysím na těch normálách.
kód:

            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, x, y, 0, GL_RGBA, GL_FLOAT, NULL);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 10. květen 2011, 11:35:35    Předmět: Odpovědět s citátem

no ak ti to pri RGBA16 pise ze je kompletny tak by som to skusil s nim. ono karty aj tak casto zarovnavaju RGB formaty na RGBA
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 10. květen 2011, 11:42:36    Předmět: Odpovědět s citátem

jop, to sem taky četl ale kdyz to bude jenom GL_RGBA16 a né GL_RGBA16F_ARB, tak mám jistotu že je to ve floatu? To že je to ve floatu tak natvrdo určí to GL_FLOAT?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



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

PříspěvekZaslal: 10. květen 2011, 11:45:51    Předmět: Odpovědět s citátem

Ano Smile Aky typ dat by si tam este chcel davat? Normalne to bude HW half.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 10. květen 2011, 11:52:01    Předmět: Odpovědět s citátem

ja si jenom potreboval bejt jistej:D moje prvni pokusy s float texturama a nerad bych se s tim potom jebal ze to nefunguje Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 10. květen 2011, 11:56:36    Předmět: Odpovědět s citátem

ono ak je posledny parameter glTexImage2D tak by malo byt takmer jedno co posles ako predchadzajuce dva parametre.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



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

PříspěvekZaslal: 10. květen 2011, 11:59:06    Předmět: Odpovědět s citátem

Skoro žádný hardware neumí GL_RGB, takže bych se tomu formátu vyhnul (vždycky se to na pozadí převede do RGBX, kde X by se mělo za všech okolností chovat jako 1). Jediný nativní RGB formát textur je DXT1. Nativně by mělo jít renderovat do tohoto:
- GL_RED*
- GL_RG*
- GL_RGBA

* vyžaduje GL_ARB_texture_rg

My to v driverech řešíme tak, že rovnou pro RGB formáty použijeme RGBA, takže i když vytvoříš RGB texturu, driver do ní umí renderovat (a při TexImage se to musí převádět na CPU).


Jo mimochodem, GL_FLOAT neurčí vůbec nic, takže správná odpověď je NE. Smile Pouze 'internalformat' má vliv na typ textury. Jsou to základy OpenGL, ale budiž. Takhle vypadá funkce glTexImage2D:

void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *data);

internalformat určuje formát textury, to je jasné. Parametry format a type určují formátování parametru data. Pokud data je NULL, pak format a type může být cokoliv (nebo spíš může být GL_NONE, podle toho jak přísně se kontrolují parametry).

GL_RGBA16 je typu unsigned normalized. (tj. rozsah [0, 1]).
GL_RGBA16_SNORM je typu signed normalized. (tj. rozsah [-1, 1])
GL_RGBA16F je typu float.
GL_RGBA16UI je typu unsigned int.
GL_RGBA16I je typu signed int.

Vyber si.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 10. květen 2011, 12:33:04    Předmět: Odpovědět s citátem

no data moze obsahovat offset ak je bindnute nejaky buffer do GL_UNPACK_BUFFER_DATA
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 10. květen 2011, 12:41:36    Předmět: Odpovědět s citátem

ok, shrnu to, teďka sem si dopsal shader a když ty textury zkombinuju a udělám klasickej NdotL, tak dostanu osvětlení jako při forward renderu, háček je v tom že se to světlo transformuje podle rotace kamery, což je divné.

eosie: chápu, četl sem specifikaci ale, jakmile tam začnu cpát GL_RGBA16(32)F nebo cokoliv jinýho než RGBA8,16 tak dostávám (36058) = GL_FRAMEBUFFER_INCOMPLETE_FORMATS, proto jsem z toho krapet zmatenej, předpokládám že do [0,1] nedostanu pozice vertexů, nebo snad ano? Nevím to, učím se Wink.

Jinak sem se taky dočetl že pozice by měly bejt uložený v 32F ale momentálně je mám taky v RGB16 na zkoušku a všechno funguje normálně.

WTF?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



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

PříspěvekZaslal: 10. květen 2011, 16:07:44    Předmět: Odpovědět s citátem

Pokud máš pozice v clip space, tak se to do GL_RGBA16 vejde a na první pohled by to mohlo vypadat i normálně.

Jinak ta karta by měla umět RGBA16F. Zkus nastavit wrapping na CLAMP_TO_EDGE.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 10. květen 2011, 16:32:33    Předmět: Odpovědět s citátem

Pozice ukládám jako jenom hloubku do R32F ... koukni případně o topic níž, kde něco pro deferred rendering řeším taky Smile
Normály pro debug mám v RGB8 a výsledek je relativně koukatelný.

Jinak RGBA 32F/16F mi na GF 7900 taky blbne a nefunguje korektně, nicméně mi ten formát přijde na použití u deferred renderingu dost nepotřebný.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 10. květen 2011, 18:20:05    Předmět: Odpovědět s citátem

Eosie: wrapping jsem zkousel, bez vysledku, furt ten stejnej problem, je to rozbite Very Happy btw ja tam mam dement RGBA ale dycky to zapomenu napsat Very Happy
Perry: ty full pozice mam jenom na zkousku, potom si to zrekonstuuju z hloubky.

Dejme tomu, že to funguje, spíš mě trápí to, že se mi rotuje to světlo s kamerou.. nebo spíš podle úhlz hasne a rožíná.

prvni pass shader
kód:

   varying mat4 TBN;
   varying vec4 position;
   varying vec4 normal;
   attribute vec3 tangent;
   
   bool bUseBumpMapping = %s;
   bool bUseShadows = %s;
   
   void main(void)
   {
        gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
        gl_TexCoord[0] = gl_MultiTexCoord0;
       
        position = gl_Position;
       
        if(bUseBumpMapping)
        {
            vec3 n = normalize(vec3(gl_NormalMatrix * gl_Normal));
            vec3 t = normalize(vec3(gl_NormalMatrix * tangent));
            vec3 b = cross(n, t);
           
            TBN = mat4(t.x, b.x, n.x, 0,
                       t.y, b.y, n.y, 0,
                       t.z, b.z, n.z, 0,
                         0,   0,   0, 1);
        }else{
            normal = vec4(vec3(gl_NormalMatrix * gl_Normal), 1.0);
        }
       
        if(bUseShadows) gl_TexCoord[7] = gl_TextureMatrix[7] * gl_Vertex;
    }
       
    varying mat4 TBN;
    varying vec4 position;
    varying vec4 normal;
   
    uniform sampler2D DiffuseMap;
    uniform sampler2D NormalMap;
    uniform sampler2D SpecularMap;
    uniform sampler2DShadow ShadowMap;
   
    bool bUseBumpMapping = %s;
    bool bUseShadows = %s;
   
    void main(void)
    {
        float shadow = 1.0;
        float gloss = 0.0;
        if(bUseShadows) shadow = shadow2D(ShadowMap, gl_TexCoord[7]).x;
        if(bUseBumpMapping) gloss = texture2D(SpecularMap, gl_TexCoord[0].st).x;
       
        gl_FragData[0] = texture2D(DiffuseMap, gl_TexCoord[0].st);
        gl_FragData[1] = vec4(position.xyz, shadow);
        if(bUseBumpMapping)
        {
            gl_FragData[2] = (texture2D(NormalMap, gl_TexCoord[0].st) * 2.0 - 1.0) * TBN;
            gl_FragData[2].a = gloss;
        }else{
            gl_FragData[2] = vec4(normal.xyz, 1.0);
            gl_FragData[2].a = 1.0;
        }
    }


svetelnej shader,
kód:
    uniform sampler2D DiffuseMap;
    uniform sampler2D PositionMap;
    uniform sampler2D NormalMap;
   
    void main(void)
    {
        vec4 color = texture2D(DiffuseMap, gl_TexCoord[0].xy);
        vec4 position = texture2D(PositionMap, gl_TexCoord[0].xy);
        vec4 normal = texture2D(NormalMap, gl_TexCoord[0].xy);
       
        //svetlo je urcite nastaveny, aji kdyz mu hodim fixovanou pozici v shaderu, tak to nema vliv
        vec3 lightDir = normalize(gl_LightSource[0].position.xyz - position.xyz);
       
        gl_FragColor = vec4(vec3(dot(normal.xyz, lightDir)), 1.0);
    }


nějakej problém?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Játro.m



Založen: 01. 02. 2010
Příspěvky: 230

PříspěvekZaslal: 10. květen 2011, 18:45:54    Předmět: Odpovědět s citátem

no vyřešeno, kdyby někdo měl stejnej problém, tak -> http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=290226&page=2 poslední příspěvek ;D
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
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