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
|
Zaslal: 10. květen 2011, 09:56:01 Předmět: Float textury na stařičké GF7150 |
|
|
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ý
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 10. květen 2011, 11:35:35 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 10. květen 2011, 11:42:36 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 10. květen 2011, 11:45:51 Předmět: |
|
|
Ano 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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 10. květen 2011, 11:52:01 Předmět: |
|
|
ja si jenom potreboval bejt jistej:D moje prvni pokusy s float texturama a nerad bych se s tim potom jebal ze to nefunguje  |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 10. květen 2011, 11:56:36 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 10. květen 2011, 11:59:06 Předmět: |
|
|
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. 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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 10. květen 2011, 12:33:04 Předmět: |
|
|
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 10. květen 2011, 12:41:36 Předmět: |
|
|
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 .
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 10. květen 2011, 16:07:44 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 10. květen 2011, 16:32:33 Předmět: |
|
|
Pozice ukládám jako jenom hloubku do R32F ... koukni případně o topic níž, kde něco pro deferred rendering řeším taky
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 10. květen 2011, 18:20:05 Předmět: |
|
|
Eosie: wrapping jsem zkousel, bez vysledku, furt ten stejnej problem, je to rozbite btw ja tam mam dement RGBA ale dycky to zapomenu napsat
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 |
|
 |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
|
Návrat nahoru |
|
 |
|