.[ ČeskéHry.cz ].
OpenGL (ES) - glDrawElements - GL_INVALID_OPERATION
Jdi na stránku 1, 2  Další
 
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
perry



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

PříspěvekZaslal: 7. prosinec 2013, 18:33:55    Předmět: OpenGL (ES) - glDrawElements - GL_INVALID_OPERATION Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 7. prosinec 2013, 18:50:13    Předmět: Re: OpenGL (ES) - glDrawElements - GL_INVALID_OPERATION Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 7. prosinec 2013, 18:54:26    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 7. prosinec 2013, 23:06:26    Předmět: Odpovědět s citátem

Jak by řekl Poky, chyba bude v konstantě... Razz

Zkoušel sis přečíst tohle? https://www.opengl.org/discussion_boards/showthread.php/178948-Trouble-with-glDrawElements-and-AccessViolation
Možná, že bys tam mohl nalézt odpověď...kdo ví. Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 8. prosinec 2013, 09:58:49    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



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

PříspěvekZaslal: 8. prosinec 2013, 11:13:45    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 8. prosinec 2013, 12:33:21    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 8. prosinec 2013, 12:54:43    Předmět: Odpovědět s citátem

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 Smile

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 8. prosinec 2013, 13:09:04    Předmět: Odpovědět s citátem

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 Smile


...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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 8. prosinec 2013, 13:10:59    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 8. prosinec 2013, 13:19:35    Předmět: Odpovědět s citátem

ok, jak se potom generuje vertex array 1 (#13 glBindVertexArray(1))? Souhlasi tam pozice atributu s shaderem?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 8. prosinec 2013, 13:25:53    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 8. prosinec 2013, 13:37:48    Předmět: Odpovědět s citátem

A jsi si jisty ze int(POSITION.W) nikdy nespadne mimo <0, 63> a ze stateIndex je cely validni?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 8. prosinec 2013, 13:44:36    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 8. prosinec 2013, 13:52:32    Předmět: Odpovědět s citátem

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
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
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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