Войти
ПрограммированиеФорумГрафика

Текстура растягивается на весь экран если работает шейдер (opengl)

#0
20:45, 6 сен. 2012

Всем доброго времени суток.

у меня стоит задача вывести на экран картинку(предварительно сделанный скриншот)

делаю таким образом

glEnable(GL_TEXTURE_2D);  
  glClearColor(0, 0, 0, 0);
  glClearDepth(1.0);
  glDepthFunc(GL_LESS);
  glEnable(GL_DEPTH_TEST);
  glShadeModel(GL_SMOOTH);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  gluPerspective(45.,Screen.Width/Screen.Height,0.1,100.0);

  glMatrixMode(GL_MODELVIEW);

  glEnable( GL_TEXTURE_2D );
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();
  glTranslatef(0.0,0.0,-5.0);
  glBindTexture(GL_TEXTURE_2D, texure1);

/////////////////////////////////////////////////////
  glUseProgramObjectARB(SHprogram);
/////////////////////////////////////////////////////

  glBegin(GL_QUADS);
    glTexCoord2d(0, 0); glVertex2f(-1,-1);
    glTexCoord2d(1, 0); glVertex2f(1,-1);
    glTexCoord2d(1, 1); glVertex2f(1,1);
    glTexCoord2d(0, 1); glVertex2f(-1,1);
  glEnd;
  SwapBuffers(wglGetCurrentDC);

вроде всё правильно, создаётся полигон, и на него накладывается текстура.
вот только ни как не пойму из-за чего текстура растягивается во весь экран (и то криво) если заюзать шейдер.
Может я его не в том месте включаю, подскажите. обычный шейдер для блюра
вершинный

in vec2 VertexPosition;

void main(void) {
  gl_Position = vec4(VertexPosition, 0.0, 1.0);
}
и фрагментный
uniform sampler2D image;

out vec4 FragmentColor;

uniform float offset[5] = float[]( 0.0, 1.0, 2.0, 3.0, 4.0 );
uniform float weight[5] = float[]( 0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162 );

void main(void)
{
  FragmentColor = texture2D( image, vec2(gl_FragCoord)/1024.0 ) * weight[1];
  for (int i=1; i<5; i++) {
    FragmentColor += texture2D( image, ( vec2(gl_FragCoord)+vec2(offset[i], 0.0) )/1024.0 ) * weight[i];
    FragmentColor += texture2D( image, ( vec2(gl_FragCoord)-vec2(offset[i], 0.0) )/1024.0 ) * weight[i];
  }
}
всё размывается нормально, только текстура растягивается
вот что есть если закоментить glUseProgramObjectARB(SHprogram);
Изображение
и вот что если раскоментить
Изображение
а мне нужно что бы просто размылась текстура. Подскажите где я накосячил


#1
21:17, 6 сен. 2012

borisenki
> gl_Position = vec4(VertexPosition, 0.0, 1.0);
а кто будет умножать на матрицу вида и проекции?

Для GLSL < 1.4

gl_Position = ftransform();

В старших версиях функция ftransform() устарела и матрицы надо перемножать вручную. А луче сразу вручную перемножай.
На английской википедии есть примеры простейших шейдеров, возьми их за образец.

#2
21:20, 6 сен. 2012

попробуй в вершинном :

...
gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord [0] = gl_MultiTexCoord0;
...
#3
23:09, 6 сен. 2012

veth
ALPINE

не помогло, картинка растягивается, но теперь не во весь экран.

на самом деле это я так делаю от того что не получилось изначально как я хотел

glPushMatrix();
  glClearColor( 0.0, 0.0, 0.0, 0.0 );
  glClear( GL_COLOR_BUFFER_BIT );

  glEnable( GL_TEXTURE_2D );
  glBindTexture(GL_TEXTURE_2D, texure1);
  //glUseProgramObjectARB(SHprogram);
  //glDrawArrays(GL_TRIANGLES, 0, 6);


  glBegin( gl_polygon );
  glTexCoord2d(0, 0); glVertex2f(-1, -1);
  glTexCoord2d(1, 0); glVertex2f(1, -1);
  glTexCoord2d(1,1); glVertex2f(1,1);
  glTexCoord2d(0,1); glVertex2f(-1,1);

  glEnd();
  glPopMatrix();

  SwapBuffers(wglGetCurrentDC);

без шейдера отображается, прям так как нужно.

void main (void)
{
gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord [0] = gl_MultiTexCoord0;
}
ни как не помогает. может не в шейдере дело у меня?
#4
5:04, 7 сен. 2012

Дело в gl_FragCoord
Попробуйте вместо vec2(gl_FragCoord)/1024.0 подставить gl_TexCoord[0].st

А цикл настоятельно рекомендую развернуть.

#5
12:24, 7 сен. 2012

RPG

А цикл настоятельно рекомендую развернуть.

Какой цикл развернуть? не догоняю маленько.

#6
16:22, 7 сен. 2012

RPG

Попробуйте вместо vec2(gl_FragCoord)/1024.0 подставить gl_TexCoord[0].st

не компилируется шейдер так.

#7
17:55, 7 сен. 2012
borisenki
> glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Не по вопросу, но что за or?
0х0004 || 0х0002 == 0x0001
0х0004 | 0х0002 == 0x0006
#8
18:44, 7 сен. 2012

ARtnaMed, автор пишет в делфи, а там нет различия между бинарного и логического or, так что все ок

#9
23:02, 7 сен. 2012

получилось, с другим шейдером.

struct u_Struct
  {
    float angle; 
  };
uniform sampler2D screenTexture;
uniform sampler2D screenColorBuffer;
const float blurSize = 1.0/500.0;
uniform float u_struct;
 
void main(void)
{
   vec2 vTexCoord = gl_TexCoord[0].st;
   vec4 sum = vec4(0.0);
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x - 4.0*u_struct, vTexCoord.y)) * 0.05;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x - 3.0*u_struct, vTexCoord.y)) * 0.09;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x - 2.0*u_struct, vTexCoord.y)) * 0.12;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x - u_struct, vTexCoord.y)) * 0.15;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x + u_struct, vTexCoord.y)) * 0.15;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x + 2.0*u_struct, vTexCoord.y)) * 0.12;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x + 3.0*u_struct, vTexCoord.y)) * 0.09;
   sum += texture2D(screenColorBuffer, vec2(vTexCoord.x + 4.0*u_struct, vTexCoord.y)) * 0.05;
   
   gl_FragColor = sum) ;
}

вот только это размытие по иксу. нужно применить ещё размытие то игрику.
я новичок в opengl но на сколько я знаю нужно юзать RBO, для рендера в текстуру, а затем к ней уже применить размытие по игрику.
Может кто нибудь показать пример как это делается?

#10
23:16, 7 сен. 2012

borisenki
> юзать RBO
FBO

> Может кто нибудь показать пример как это делается?
http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/

#11
17:09, 8 сен. 2012


Dimich
в книжке было сокращение RBO - renderbuffer object, а FBO - framebeffer object.

Может кто нибудь показать пример как это делается?

я имел в виду как производить запись в текстуру и как это потом использовать.

тут я был http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/ там только шейдеры описаны

#12
1:33, 9 сен. 2012

borisenki
> получилось, с другим шейдером.
Ну вот, тут используется вышеупомянутый gl_TexCoord[0].st

gl_TexCoord - это координаты на полигоне, а gl_FragCoord, который вы пытались использовать - координаты экрана.


И почему у вас с предыдущем не вышло... Видать где-то ещё ошиблись.

ПрограммированиеФорумГрафика

Тема в архиве.