Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > OpenGl проблема с шейдерами


Автор: Ketrikken 8.12.2009, 13:39
Помогите, пожалуйста!
Я пытаюсь сделать шейдер для изменения якрости.

Код на glsl выглядит так
Код

uniform sampler2D texFrame;
void main(void)
{
  vec3 texColor = texture2D(texFrame, gl_TexCoord[0].st).rgb; 
}

пока даже ничего существенного не происходит.

это код на Delphi 
Код

procedure TForm1.Init;
begin

  DC := GetDC(Handle);
  SetDCPixelFormat(DC);
  hrc := wglCreateContext(Canvas.Handle);
  wglMakeCurrent(DC, hrc);

  glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
  glNewList (ListName, GL_COMPILE);
    glBegin(GL_QUADS) ;
     glTexCoord2d (0.0, 0.0);
      glVertex2f (-1.0, -1.0);
      glTexCoord2d (640 / 1024, 0.0);
      glVertex2f (1.0 , -1.0);
      glTexCoord2d (640 / 1024, 480 / 1024);
      glVertex2f (1.0, 1.0);
      glTexCoord2d (0.0, 480 / 1024);
      glVertex2f (-1.0, 1.0);
    glEnd;
  glEndList;

  glGenTextures(2, @TexName);
  glBindTexture(GL_TEXTURE_2D, TexName);
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  glTexImage2D(GL_TEXTURE_2D, 0, 3, 1024, 1024, 0, {GL_RGB}BGR_EXT, GL_UNSIGNED_BYTE, FTexImage);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

  glEnable(GL_TEXTURE_2D);

  CreateShader;
end;


procedure TForm1.CreateShader;
begin
  FFragmentProgram := glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  if FFragmentProgram <> 0 then
  begin
    LoadShader(FFragmentProgram, 'shader.fsh');
    FProgram := glCreateProgramObjectARB;
    if FProgram <> 0 then
    begin
      glAttachObjectARB(FProgram, FFragmentProgram);

      glLinkProgramARB(FProgram);

      glValidateProgramARB(FProgram);
      CheckGLSLError(FProgram, GL_OBJECT_VALIDATE_STATUS_ARB);
//до этого момента функция CheckGLSLError возвращает, что у меня все хорошо сбилдилось 
и скомпилилось

      texture := glGetUniformLocationARB(FProgram, PChar('texFrame'));
      glUseProgramObjectARB(FProgram);

      glUniform1fARB(texture, @TexName);
      CheckGLSLError(FProgram, GL_OBJECT_ACTIVE_UNIFORMS_ARB); //возвращает ошибку, пишет,
что текстура не была задана
    end;
  end;
end;


причем, если я убираю строчку
vec3 texColor = texture2D(texFrame, gl_TexCoord[0].st).rgb; 
все работает. я ее изменяла так:
vec4 texColor = texture2D(texFrame, gl_TexCoord[0].st); 
и  так
float texColor = texture2D(texFrame, gl_TexCoord[0].st).r; 
все равно не работает.

Подскажите, что не так? Заранее спасибо!

Автор: Bitter 8.12.2009, 16:19
я не особо понимаю в шейдерах GL, но разве функция main  не должна иметь тип (наверно vec4) и return ? Вот в шейдерах DirectX функция либо имеет тип float4 либо параметр out float4 oCol:COLOR. Ну вот обычный пример шейдера на DirectX, может по подобию напишешь на GL

Код

 
 sampler2D tex0;
 
 void func (in float2 base : TEXCOORD0,
                 out float4 oCol:COLOR)
 {
   oCol = tex2D(tex0, base);
 };



На выходе шейдера должен быть цвет пикселя. А у тебя вроде нету ничего

Добавлено через 2 минуты и 11 секунд
Да, и еще на вход у тебя ничего не поступает. Это так и должно быть?

Автор: Rpahut 24.12.2009, 16:46
Если только в делфи текстуры не типа float, то следует использовать glUniform1iARB(texture, @TexName);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)