Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 7. prosinec 2013, 18:33:55 Předmět: OpenGL (ES) - glDrawElements - GL_INVALID_OPERATION |
|
|
Zdravím,
mám ultimátní problém a netuším co je blbě a proč. Pomocí OpenGL ES renderuji geometrii s IB/VB pomocí glDrawElements.
Na iPhone 4 vše jede jak má, když to hodím na jiný model (5s), tak se aplikace složí na glDrawElements.
A teď co je WTF. Vykreslí to půlku scény a neprojde to pouze u jednoho objektu. Porovnával jsem všechno možné a zbytek scény renderuji stejným způsobem (volají se stejné funkce i stejné pořadí).
Druhý WTF je, že podle dokumentace ES, glDrawElements vůbec GL_INVALID_OPERATION vracet nemá glDrawElements).
Pro ES 3.0 tam pak přibylo GL_INVALID_OPERATION is generated if transform feedback is active and not paused.. Vzhledem k tomu, že 5s má opengl es 3.0 tak to možná na pozadí používá i pro ES 2.0.. ale nic, co by tuhle chybu mohlo vygenerovat tam nemám (žádný glGenTransformFeedbacks apod. nikde nemám)
Díky _________________ Perry.cz
Naposledy upravil perry dne 7. prosinec 2013, 19:37:34, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 7. prosinec 2013, 18:50:13 Předmět: Re: OpenGL (ES) - glDrawElements - GL_INVALID_OPERATION |
|
|
perry napsal: |
Druhý WTF je, že podle dokumentace ES, glDrawElements vůbec GL_INVALID_OPERATION vracet nemá.
Díky |
a vyvolava tuto chybu skutecne glDrawElements() a ne nejaka predchazejici gl funkce? GL_INVALID_OPERATION generuje spousta funkci, co treba glUniform? |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 7. prosinec 2013, 18:54:26 Předmět: |
|
|
No dával jsem před to glDrawElements glGetError a zkoušel vytáhnout zásobník, ale to psalo že vše je OK... vzhledem k tomu, že mám každý gl call obalený zachycením chyby, tak to skončí podle mě vážně až u toho draw.
Navíc debugger v Xcode hlásí chybu také na stejném místě _________________ Perry.cz |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 8. prosinec 2013, 09:58:49 Předmět: |
|
|
Ta popsaná chyba se týká "velkého" OpenGL.
Nicméně, pokud zakomentuju pouze ten jeden jediný drawCall pro ten jediný specifický objekt, všechno běží normálně a bez chyb.
Kontroloval jsem i obsah VB / IB a ten se mi zdá OK. Navíc program nespadne, ale normálně běží akorát glGetError vrací chybu a nic se nekreslí _________________ Perry.cz |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 8. prosinec 2013, 11:13:45 Předmět: |
|
|
Tady přidávám ještě plnou sekvenci toho, co se v GL volá (na řádce #15 se to podělá)
kód: |
#0 glClearColor(0.0000000, 0.0588235, 0.3333333, 1.0000000)
#1 glClearDepthf(0.0000000)
#2 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
#3 glBindFramebuffer(GL_FRAMEBUFFER, 1)
#4 glEnable(GL_BLEND)
#5 glUseProgram(47)
#6 glActiveTexture(GL_TEXTURE0)
#7 glBindTexture(GL_TEXTURE_2D, 25)
#8 glUniform1i(guiBgTetxure, 0)
#9 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
#10 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
#11 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
#12 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
#13 glBindVertexArray(1)
#14 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 39)
#15 glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_INT, nullptr)
#16 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
#17 glBindVertexArray(0)
#18 glUseProgram(0)
#19 glDisable(GL_BLEND)
#20 glBindRenderbuffer(GL_RENDERBUFFER, 1)
#21 ["Context 1" presentRenderbuffer:GL_RENDERBUFFER] |
_________________ Perry.cz |
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 8. prosinec 2013, 12:33:21 Předmět: |
|
|
perry napsal: |
Tady přidávám ještě plnou sekvenci toho, co se v GL volá (na řádce #15 se to podělá)
kód: |
#0 glClearColor(0.0000000, 0.0588235, 0.3333333, 1.0000000)
#1 glClearDepthf(0.0000000)
#2 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
#3 glBindFramebuffer(GL_FRAMEBUFFER, 1)
#4 glEnable(GL_BLEND)
#5 glUseProgram(47)
#6 glActiveTexture(GL_TEXTURE0)
#7 glBindTexture(GL_TEXTURE_2D, 25)
#8 glUniform1i(guiBgTetxure, 0)
#9 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
#10 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
#11 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
#12 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
#13 glBindVertexArray(1)
#14 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 39)
#15 glDrawElements(GL_TRIANGLES, 30, GL_UNSIGNED_INT, nullptr)
#16 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
#17 glBindVertexArray(0)
#18 glUseProgram(0)
#19 glDisable(GL_BLEND)
#20 glBindRenderbuffer(GL_RENDERBUFFER, 1)
#21 ["Context 1" presentRenderbuffer:GL_RENDERBUFFER] |
|
glBindVertexArray je glBindVertexArrayOES? VAO si prece pamatuje element array buffer, proc se binduje?
Byl VAO vygenerovan s nabindovanym shaderem? Jinak by nemusela souhlasit pozice atributu v glVertexAttribPointer.
edit: urcite glDrawElements s GL_UNSIGNED_INT? typicky bych cekal spis GL_UNSIGNED_SHORT. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 8. prosinec 2013, 12:54:43 Předmět: |
|
|
VAO v GLES není, tohle je EXT od Apple a ELEMENT_BUFFER mi tam nešel. Stejné platí i pro UNSIGNED_INT, opět EXT od Apple
Jinak dotrackoval jsem chybu do shaderu:
kód: |
precision highp float;
attribute vec4 POSITION;
attribute vec2 TEXCOORD0;
attribute vec2 TEXCOORD1;
attribute vec2 TEXCOORD2;
attribute vec2 TEXCOORD3;
uniform int stateIndex[64];
varying vec2 vTexCoord;
void main()
{
gl_Position = vec4(POSITION.xyz, 1.0);
int index = stateIndex[int(POSITION.w)];
if (index == -1)
{
gl_Position = vec4(0,0,0,0);
index = 0;
}
if (index == 1) vTexCoord = TEXCOORD1;
else if (index == 2) vTexCoord = TEXCOORD2;
else if (index == 3) vTexCoord = TEXCOORD3;
else vTexCoord = TEXCOORD0;
}
|
kód: |
precision highp float;
varying vec2 vTexCoord;
uniform sampler2D guiBgTetxure;
void main()
{
//gl_FragColor = vec4(0.0,1.0,0.0,1.0);
//gl_FragColor.xz += vTexCoord.xy;
gl_FragColor = texture2D(guiBgTetxure, vTexCoord);
} |
Když jakkoliv použiju vTexCoord, tak to nejde. Pokud ale vyhazuji jako výstup pouze barvu, jde to. Zrovna tak to jde, pokud ve VS místo těch if (index == 1) atd dám jenom vTexCoord = TEXCOORD0. To mi hlava nebere co je blbě. Ten shader se navíc přeloží OK a data v TEXCOORD jsou taky legální (můžu dělat ručně vTexCoord = TEXCOORD1, vTexCoord = TEXCOORD2 apod. a jde to)
Navíc první podmínka if (index == -1) funguje, protože pak mám určité trojúhelníky, co to nekreslí a ty tam opravdu nejsou => to pole by mělo být také OK _________________ Perry.cz |
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 8. prosinec 2013, 13:09:04 Předmět: |
|
|
perry napsal: |
VAO v GLES není, tohle je EXT od Apple a ELEMENT_BUFFER mi tam nešel. Stejné platí i pro UNSIGNED_INT, opět EXT od Apple  |
...tehle vete nerozumim. Psal jsi ze ladis na iPhone. V iOS VAO pomoci te extenze bezne pouzivam a element buffer tam taky mam; stejne tak pouzivam unsigned short. Nebo se snazis nepouzit zadnou extenzi? Nejak jsem to nepochopil. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 8. prosinec 2013, 13:10:59 Předmět: |
|
|
No.. to že tam ten buffer nemám je detail, tím ta chyba není vzhledem k tomu, že jsem jí dotrackoval do GLSL.
UNSIGNED_SHORT se použít dá, ale pokud mám větší indexy, potřebuji UNSIGNED_INT - to ovšem není GLES 2.0 standard (stejně jako VAO), ale Apple to podporuje. _________________ Perry.cz |
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 8. prosinec 2013, 13:19:35 Předmět: |
|
|
ok, jak se potom generuje vertex array 1 (#13 glBindVertexArray(1))? Souhlasi tam pozice atributu s shaderem? |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 8. prosinec 2013, 13:25:53 Předmět: |
|
|
Souhlasí... jak jsem psal, pokud v shaderu vyhodím ten if blok (resp. upravím)
tzn z
kód: |
if (index == 1) vTexCoord = TEXCOORD1;
else if (index == 2) vTexCoord = TEXCOORD2;
else if (index == 3) vTexCoord = TEXCOORD3;
else vTexCoord = TEXCOORD0; |
udělám
kód: |
if (index == 1) vTexCoord = TEXCOORD1;
else if (index == 2) vTexCoord = TEXCOORD2;
else if (index == 3) vTexCoord = TEXCOORD3;
else vTexCoord = TEXCOORD0;
index = TEXCOORD0;
|
vše jde.
Stejný efekt (jako že to jde) má i např. tohle:
kód: |
index = 1;
if (index == 1) vTexCoord = TEXCOORD1;
else if (index == 2) vTexCoord = TEXCOORD2;
else if (index == 3) vTexCoord = TEXCOORD3;
else vTexCoord = TEXCOORD0;
|
Nicméně tohle
kód: |
if (index == -1)
{
gl_Position = vec4(0,0,0,0);
index = 0;
}
|
funguje... podělá se to až pak dál na těch 4 řádkách. Netuším proč, kde, co, jak. Jediné co mě začíná napadat je 64bitová architektura u 5S, ale to se mi nějak nezdá _________________ Perry.cz |
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 8. prosinec 2013, 13:37:48 Předmět: |
|
|
A jsi si jisty ze int(POSITION.W) nikdy nespadne mimo <0, 63> a ze stateIndex je cely validni? |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 8. prosinec 2013, 13:44:36 Předmět: |
|
|
Jj... navíc kdyby to lezlo někam mimo, tak to nebude fungovat s tim jak jsem psal ty úpravy.
Plus právě jsem to upravil na tohle:
kód: |
if (index == 1) vTexCoord = TEXCOORD1;
if (index == 2) vTexCoord = TEXCOORD2;
if (index == 3) vTexCoord = TEXCOORD3;
if (index == 0) vTexCoord = TEXCOORD0;
|
a všechno běží.. což absolutně nepobírám _________________ Perry.cz |
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 8. prosinec 2013, 13:52:32 Předmět: |
|
|
perry napsal: |
Jj... navíc kdyby to lezlo někam mimo, tak to nebude fungovat s tim jak jsem psal ty úpravy. |
to nemusi byt az tak uplne pravda. Protoze:
kód: |
if (index == 1) vTexCoord = TEXCOORD1;
else if (index == 2) vTexCoord = TEXCOORD2;
else if (index == 3) vTexCoord = TEXCOORD3;
else vTexCoord = TEXCOORD0;
index = TEXCOORD0;
|
predpokladam ze posledni radek index = TEXCOORD0 je chyba a ma byt vTexCoord = TEXCOORD0; v takovem pripade uz kompilator shaderu cely if blok urcite odstrani...
edit: take bych si dohledal ve specifikaci non-uniform flow control.
Naposledy upravil quas4 dne 8. prosinec 2013, 14:01:17, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
|