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

Založen: 13. 05. 2008 Příspěvky: 19
|
Zaslal: 14. říjen 2010, 12:27:09 Předmět: funkce glRasterPos2i a glDrawPixels |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 14. říjen 2010, 14:27:46 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 14. říjen 2010, 23:37:47 Předmět: |
|
|
glCopyPixels funguje? _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
petr

Založen: 13. 05. 2008 Příspěvky: 19
|
Zaslal: 15. říjen 2010, 08:47:02 Předmět: |
|
|
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 15. říjen 2010, 12:04:33 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 15. říjen 2010, 17:46:33 Předmět: |
|
|
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 |
|
 |
petr

Založen: 13. 05. 2008 Příspěvky: 19
|
Zaslal: 18. říjen 2010, 10:27:07 Předmět: |
|
|
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 |
|
 |
petr

Založen: 13. 05. 2008 Příspěvky: 19
|
Zaslal: 18. říjen 2010, 11:10:37 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 18. říjen 2010, 14:59:34 Předmět: |
|
|
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 |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 18. říjen 2010, 19:12:34 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 19. říjen 2010, 16:07:51 Předmět: |
|
|
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 |
|
 |
petr

Založen: 13. 05. 2008 Příspěvky: 19
|
Zaslal: 20. říjen 2010, 14:50:06 Předmět: |
|
|
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 |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 20. říjen 2010, 15:18:50 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 20. říjen 2010, 20:19:26 Předmět: |
|
|
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 |
|
 |
petr

Založen: 13. 05. 2008 Příspěvky: 19
|
Zaslal: 22. říjen 2010, 13:47:31 Předmět: |
|
|
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é
Pokud zaremuju řádek:
kód: |
//glAttachShader(mi_sh_program, mi_frag_shdr); |
vrací:
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 |
|
 |
|