.[ ČeskéHry.cz ].
funkce glRasterPos2i a glDrawPixels
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
petr



Založen: 13. 05. 2008
Příspěvky: 19

PříspěvekZaslal: 14. říjen 2010, 12:27:09    Předmět: funkce glRasterPos2i a glDrawPixels Odpovědět s citátem

Dobrý den, jakým způsobem vykreslím čtverec pomocí glDrawPixels na zadané rastrové pozici (3 a 5).
Zkouším to na následující kódu a:
1) načítaná oblast ReadPixels souhlasí
2) vykreslí pixely na jiné souřadnici než očekávám
3) proč jsou pixely ztmavené



Díky za odpovědi.

kód:
void cpypx()
{
   int size=150;
   float pxbuff[150][150][3];
   ZeroMemory(pxbuff,sizeof(pxbuff));
   
   glReadBuffer(GL_BACK);

   glReadPixels(0,0,size,size,GL_RGB,GL_FLOAT,pxbuff);
   
   for (int x=0;x<size;x++){
      for (int y=0;y<size;y++){
         pxbuff[x][y][0]=pxbuff[x][y][0];// * 0.1f;
         pxbuff[x][y][1]=pxbuff[x][y][0];// * 0.1f;
         pxbuff[x][y][2]=pxbuff[x][y][0];// * 0.1f;
      }
   }
   
   glDrawBuffer(GL_BACK);
   if(glGetError() != GL_NO_ERROR)
      retcode = glGetError();
   
   glRasterPos2i(3, 5);
   if(glGetError() != GL_NO_ERROR)
      retcode = glGetError();
   
   glDrawPixels(size,size,GL_RGB,GL_FLOAT,pxbuff);   
   if(glGetError() != GL_NO_ERROR)
      retcode = glGetError();
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 14. říjen 2010, 14:27:46    Předmět: Odpovědět s citátem

pozicia zadana do glRasterPos() je transformovana ako normalny vertex. to k odlisnej pozicii. preco je to tmave netusim. skus zakomentovat ten for cyklus alebo pouzit GL_UNSIGNED_BYTE a zmenit float pxbuff na unsigned char.
_________________
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: 14. říjen 2010, 23:37:47    Předmět: Odpovědět s citátem

glCopyPixels funguje?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petr



Založen: 13. 05. 2008
Příspěvky: 19

PříspěvekZaslal: 15. říjen 2010, 08:47:02    Předmět: Odpovědět s citátem

1) Změna datového typu pole na:
kód:
#define size 150
GLubyte pxbuff[size][size][3];

po zavolání
kód:
glReadPixels(0,0,size,size,GL_RGB,GL_UNSIGNED_BYTE,pxbuff);

a vyskočení z funkce void cpypx() (viz první příspěvek) vyvolá dialog:


2) glCopyPixels - kopíruje, ale pixely ztmavuje
glDrawPixels - hodnoty barev v bufferu jsou nastaveny na:
kód:
memset(pxbuff,255,sizeof(pxbuff));

nicméně pixely jsou zase "tmavé"

kód:
unsigned int lui_size = 150;
unsigned int lui_retcode=0;
GLubyte pxbuff[150][150][3];

memset(pxbuff,255,sizeof(pxbuff));
glDrawBuffer(GL_BACK);

glRasterPos2i(2, 5);
   if(glGetError() != GL_NO_ERROR)
      lui_retcode = glGetError();

   glDrawPixels(lui_size,lui_size,GL_RGB,GL_UNSIGNED_BYTE,pxbuff);   
   if(glGetError() != GL_NO_ERROR)
      lui_retcode = glGetError();

   glCopyPixels(0,0,250,250,GL_COLOR);





3) pokud zavolám v předchozím kódu před funkcí glRasterPos2i následující 3 řádky:

kód:
glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();
   glPopMatrix();

obrazovká je černá ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 15. říjen 2010, 12:04:33    Předmět: Odpovědět s citátem

1) ošetření glGetError() nemůžeš psát takhle, poněvadž po zavolání této funkce se to nastaví na GL_NO_ERROR (což je vždycky 0). Takže retcode bude vždycky nula.
Korektní bude něco jako:
kód:
GLenum funkce (parametry)
{
GLenum returnError = GL_NO_ERROR;
GLenum lastError = GL_NO_ERROR;
...
lastError = glGetError();
if (lastError!=GL_NO_ERROR)
  returnError = lastError;
...
return returnError;
}

2)
citace:
pokud zavolám v předchozím kódu před funkcí glRasterPos2i následující 3 řádky:
kód:
glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();
   glPopMatrix();

obrazovká je černá ...

To se nemůžeš divit, poněvadž se stane toto:
1. matice se přepne na projekční
2. matice se přidá do zásobníku
3. matice se vynuluje
4. matice se odebere ze zásobníku a stane se z ní současná projekční matice
To znamená, že v konečném efektu se pouze matice se přepne na projekční a potom ji nepřepneš, když pracuješ s jinými objekty - proto se scéna špatně posune. A nevidíš nic.

Osobně pro kreslení 2D používám tento kód:
Začátek:
kód:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();

Konec:
kód:

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();

_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
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: 15. říjen 2010, 17:46:33    Předmět: Odpovědět s citátem

Já z hlavy neznám všechny interakce glCopyPixels s jinýma funkcema, ale podle mě tam něco bude. Zkus si to nějak vygooglit. To je právě s OpenGL blbý, že ty stavy jsou všechny globální a jejich interakce je dost netriviální.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petr



Založen: 13. 05. 2008
Příspěvky: 19

PříspěvekZaslal: 18. říjen 2010, 10:27:07    Předmět: Odpovědět s citátem

Může to souviset s vykreslením nebo filtrováním textury - tmavé (černé) hrany?
pokud zaremuju tento kód:
kód:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
a nahradím tímto:
kód:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

je výsledek:
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petr



Založen: 13. 05. 2008
Příspěvky: 19

PříspěvekZaslal: 18. říjen 2010, 11:10:37    Předmět: Odpovědět s citátem

vykreslení pomocí glDrawPixels vyřešeno, pomohlo toto nastavení:

kód:
#define GL_CLAMP_TO_EDGE 0x812F
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
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: 18. říjen 2010, 14:59:34    Předmět: Odpovědět s citátem

To je blbost, textury nemají s glDrawPixels co dělat, podle mě je to bug v driveru.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



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

PříspěvekZaslal: 18. říjen 2010, 19:12:34    Předmět: Odpovědět s citátem

Divím se, že tady ještě nezaznělo, že glDrawPixels není radno vůbec používat, neboť je to zastaralé a pomalé...
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



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

PříspěvekZaslal: 19. říjen 2010, 16:07:51    Předmět: Odpovědět s citátem

Pod kapotou je glDrawPixels v podstatě jen glTexImage, kde se dají pixely, následováno vykreslením quadu s tou texturou. Tak to aspoň funguje v Mesa/DRI. Volání glDrawPixels s nabindovaným PBO by mohlo být slušně rychlý.

Je to samozřejmě deprecated, ale driver musí implementovat všechno (takže se tím stejně musím zabývat).
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petr



Založen: 13. 05. 2008
Příspěvky: 19

PříspěvekZaslal: 20. říjen 2010, 14:50:06    Předmět: Odpovědět s citátem

zkouším místo glDrawPixels použít shader - glCreateShader(GL_FRAGMENT_SHADER);

scéna bez zásahu shaderu:
kód:
"void main()"
"{"
   "vec4  finalColor;"
   "finalColor = gl_Color;"
   "gl_FragColor = finalColor;"
"}"




pokud chci upravit hodnotu R z gl_Color (viz následující kód), barva výsledné scény odpovídá, ale nezobrazí textury. Co dělám špatně?
kód:
"void main()"
"{"
   "vec4  finalColor;"
   "float lf_red;"
   "finalColor = gl_Color;"
   "lf_red=finalColor.r;"
   "lf_red=lf_red*0.5;"
   "gl_FragColor = finalColor;"
   "gl_FragColor.r = lf_red;"
"}"




jestli to pomůže přidávám strukturu programu:

main

init gl
init shader
use program (shader)

mainloop
draw cube
cpypx (glDrawPixels pro ztmavený region vlevo dole)


Děkuji za odpovědi.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



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

PříspěvekZaslal: 20. říjen 2010, 15:18:50    Předmět: Odpovědět s citátem

k si potreboval len stmavit nejaky region tak stacilo vykreslit cierny stvorec s alfou na 0.5 a dosiahol by si rovnakeho vysledku.

k tomu shaderu rozmyslam ako ti moze vobec fungovat ten prvy. na textury potrebujes mat v shadery sampler2D.
za dalsie preco mam pocit ze nemas vertex shader. ten je povinny takze bez neho je jasne ze to nemoze fungovat.
_________________
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: 20. říjen 2010, 20:19:26    Předmět: Odpovědět s citátem

nou napsal:
za dalsie preco mam pocit ze nemas vertex shader. ten je povinny takze bez neho je jasne ze to nemoze fungovat.

Nemyslím si, že je povinný, nebo se mýlím?
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
petr



Založen: 13. 05. 2008
Příspěvky: 19

PříspěvekZaslal: 22. říjen 2010, 13:47:31    Předmět: Odpovědět s citátem

Mám problém se slinkováním programu, nějak se tomu nechce, na dotaz GL_LINK_STATUS vrací funkce glGetProgramiv v proměnné
kód:
li_linked=0;

Pokud zaremuju řádek:
kód:
//glAttachShader(mi_sh_program, mi_frag_shdr);

vrací:
kód:
li_linked=1;

Log vyflushne "no program defined"

kód vertex a fragment shaderu z: http://www.geeks3d.com/20091020/shader-library-lens-circle-post-processing-effect-glsl/
kód:
void setShaders()
{
   const GLchar * ls_vertexshdr_src[]=
   {
      "void main()"
      "{"
         "gl_Position = ftransform();"
         "gl_TexCoord[0] = gl_MultiTexCoord0;"
      "}"
   };

   const GLchar* ls_fragshdr_src[]=
   {
      "uniform sampler2D sceneTex; // 0"
      "uniform vec2 lensRadius; // 0.45, 0.38"
      "void main()"
      "{"
         "vec4 Color = texture2D(sceneTex, gl_TexCoord[0].xy);"
         "float dist = distance(gl_TexCoord[0].xy, vec2(0.5,0.5));"
         "Color.rgb *= smoothstep(lensRadius.x, lensRadius.y, dist);"
         "gl_FragColor = Color;"
      "}"
   };

   mi_sh_program = 0;
   mi_frag_shdr = 0;
   mi_vert_shdr = 0;
   
   GLenum le_err = glewInit();
   GLint li_compiled = 0;
   GLint li_linked = 0;
   GLint li_valid = 0;

   bool lb_ret_val=false;
   if (GLEW_OK != le_err)
      fprintf(stderr, "Error: %s\n", glewGetErrorString(le_err));
   
   mi_vert_shdr = glCreateShader(GL_VERTEX_SHADER);
   mi_frag_shdr = glCreateShader(GL_FRAGMENT_SHADER);

   glShaderSource(mi_vert_shdr, 1, ls_vertexshdr_src, NULL);
   glShaderSource(mi_frag_shdr, 1, ls_fragshdr_src, NULL);

   glCompileShader(mi_vert_shdr);
   glGetShaderiv(mi_vert_shdr, GL_COMPILE_STATUS, &li_compiled);

   glCompileShader(mi_frag_shdr);
   glGetShaderiv(mi_frag_shdr, GL_COMPILE_STATUS, &li_compiled);
   
   mi_sh_program = glCreateProgram();
   
   glAttachShader(mi_sh_program, mi_vert_shdr);
   glAttachShader(mi_sh_program, mi_frag_shdr);
   
   glLinkProgram(mi_sh_program);
   glGetProgramiv(mi_sh_program,GL_LINK_STATUS,&li_linked);
   
   if(!li_linked)
   {
      GLint  li_len=0;
      GLchar *lc_log;
      glGetProgramiv(mi_sh_program, GL_INFO_LOG_LENGTH,&li_len);

      lc_log = new GLchar(li_len);
      glGetProgramInfoLog(mi_sh_program,li_len,&li_len,lc_log);
      free(lc_log);
   }

   glValidateProgram(mi_sh_program);
   glGetProgramiv(mi_sh_program,GL_VALIDATE_STATUS,&li_valid);
   glUseProgram(mi_sh_program);

   li_compiled = li_linked = li_valid = 0;
}


díky za každé pošťouchnutí ...
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