Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 37 • Страница 2 из 2<  1  2
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
awl и работать до фига :)

_________________
forum.omskteam.ru- Все о керамограните



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Цитата:
бамп - вещь убойна

Бамп делается пркрасно и без всяких шейдеров.


 

Member
Статус: Не в сети
Регистрация: 20.06.2003
Откуда: Ижевск
Ray Adams Бамп без попиксельного освещения это не то..


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Я вот тоже дошел до того, что понадобились шейдеры в OpenGL под Delphi, никто не подскажет как прикрутить шейдер написаный в RenderMonkey к OpenGL?
Или может быть небольшой пример использования шейдера(очень надо, а времени в обрез :-()

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Daemon Не так и сложно его присобчаивать. Создаеш его там в режиме OGL обязательно, далее избавляешся по надобности от переменных, только если они конечно тебе будут нужны. Далее просто. Тебе понадобится обновленный gl юнит для Delphi. Самый лучший на данный момент dglOpenGL.pas, там есть описание всех нужных тебе расширений.
Вот список минимально необходимых.

glUseProgramObjectARB: procedure(programObj:GLHandleARB); stdcall;
glGetObjectParameterivARB: procedure(Obj:GLHandleARB; pname:GLEnum; params:PGLInt); stdcall;
glGetInfoLogARB: procedure(shaderObj:GLHandleARB; maxLength:glsizei; var length:glint;infoLog:PChar); stdcall;
glCreateShaderObjectARB: function(shaderType: glenum):GLHandleARB; stdcall;
glShaderSourceARB: procedure(shaderObj :GLHandleARB; count:glsizei; _string:PPGLCharARB; lengths:pglint);stdcall;
glCompileShaderARB: function(shaderObj: GLHandleARB):glboolean; stdcall;
glCreateProgramObjectARB: function:GLHandleARB; stdcall;
glAttachObjectARB: procedure(programObj, shaderObj:GLhandleARB); stdcall;
glDeleteObjectARB: procedure(Obj: GLHandleARB); stdcall;
glLinkProgramARB: procedure(programObj: GLHandleARB); stdcall;
glGetUniformLocationARB: function(programObj:GLhandleARB; const char:PChar):glint; stdcall;

Далее, вот у меня есть готовые процедуры
Код:
function Tfrm3DRender.LoadProgram(
  sources: array of const): GLhandleARB;
var
  i, linked: Integer;
  shader: GLhandleARB;
  log: String;
begin

  Result := glCreateProgramObjectARB;

  i := 0;
  while i < High(sources) do
  begin
    shader := LoadShader(sources[i+1].VPChar, sources[i].VInteger);

    glAttachObjectARB(Result, shader);
    glDeleteObjectARB(shader);

    INC(i, 2);
  end;

  glLinkProgramARB(Result);
  glGetObjectParameterivARB(Result, GL_OBJECT_LINK_STATUS_ARB, @linked);
  log := GetInfoLog(Result);



end;

function Tfrm3DRender.LoadProgramFromFiles(
  const filenames: array of const): GLhandleARB;
var
  i, linked: Integer;
  shader: GLhandleARB;
  log: String;
begin

  Result := glCreateProgramObjectARB;

  i := 0;
  while i < High(filenames) do
  begin
    shader := LoadShaderFromFile(filenames[i+1].VPChar, filenames[i].VInteger);

    glAttachObjectARB(Result, shader);

    INC(i, 2);
  end;

  glLinkProgramARB(Result);
  glGetObjectParameterivARB(Result, GL_OBJECT_LINK_STATUS_ARB, @linked);
  log := GetInfoLog(Result);

end;

function Tfrm3DRender.LoadShader( src: String;
   stype: GLenum): GLhandleARB;
var
  source: PChar;
  compiled, len: Integer;
  log: String;

begin

  source:=PChar(src);
  len := Length(src);

  Result := glCreateShaderObjectARB(stype);

  glShaderSourceARB(Result, 1, @source, @len);
  glCompileShaderARB(Result);
  glGetObjectParameterivARB(Result, GL_OBJECT_COMPILE_STATUS_ARB, @compiled);
  log := GetInfoLog(Result);

  if compiled <> 1 then
  begin
    //error compiling
  end;

end;

function Tfrm3DRender.LoadShaderFromFile( filename: String;
   stype: GLenum): GLhandleARB;
var
  txt: TStringList;
begin
  txt := TStringList.Create;
  txt.LoadFromFile(filename);
  Result := LoadShader(txt.Text, stype);
  txt.Free;
end;

function Tfrm3DRender.GetInfoLog(s: GLhandleARB): String;
var
  blen, slen: Integer;
  infolog: array of Char;
begin

  glGetObjectParameterivARB(s, GL_OBJECT_INFO_LOG_LENGTH_ARB, @blen);

  if blen > 1 then
  begin
    SetLength(infolog, blen);
    glGetInfoLogARB(s, blen, slen, @infolog[0]);
    Result := String(infolog);
    Exit;
  end;

  Result := '';
end;

function Tfrm3DRender.LinkPrograms(
  programs: array of GLhandleARB): GLhandleARB;
var
  i, linked: Integer;
  shader: GLhandleARB;
  log: String;
begin

  Result := glCreateProgramObjectARB;

  i := 0;
  while i <= High(programs) do
  begin
    shader := programs[i];

    glAttachObjectARB(Result, shader);

    INC(i);
  end;

  glLinkProgramARB(Result);
  glGetObjectParameterivARB(Result, GL_OBJECT_LINK_STATUS_ARB, @linked);
  log := GetInfoLog(Result);
end;

Это куски кода из ATT.
Далее, тебе надо будет после инициализации OGl подсистемы загрузить и скомпилировать шейдеры
Вот кусок кода который грузит шейдер, исходник которого лежит в двух TMemo
mVertex3 - здесь вертексный шейдер
mPixel3 - соответственно пиксельный
glvertex - глобальная переменная шейдера
glvertex: GLhandleARB;
Код:
procedure Tfrm3DRender.LoadShaders;
var s1,s2:string;
begin
     if isShaders then
     begin
          s1:=mVertex3.Text;
          s2:=mPixel3.Text;
          glvertex := LinkPrograms( [LoadShader(s1, GL_VERTEX_SHADER_ARB),LoadShader(s2, GL_FRAGMENT_SHADER_ARB)] );
     end;
     
end;

Все это ты делаеш после инициализаци, но до начала рендеринга.
Теперь в рендеринге делаеш так
Код:
glUseProgramObjectARB(glvertex); //вклчюаеш шейдер
... рисуеш что надо с использованием этого шейдера
glUseProgramObjectARB(0); //отключаеш

Если у тебя в шейдере используется переменные , то доступ к ним ты можеш получить вот так
Код:
iuniform: Integer;
iuniform := glGetUniformLocationARB(glvertex, @pass_index[0]); //получаеш индекс переменной в шейдере
glUniform1fARB(iuniform, i);  //устанавливаеш зту переменную в свое значение, тут у меня i это текущий номер прохода рендеринга

где pass_index: array [0..31] of Char;
pass_index:='pass_index'+#0;
В данном примере у меня переменная типа int, если тебе надо ввести переменные типа float то применять надо другие glUniforXXXX функции.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Ray Adams огромное спасибо. Обновленный файл нашел :-) Буду разбираться, но в целом вообщем-то принцып понятен, еще раз спасибо.

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Daemon Там не сложно, могу дать исходничек с примером.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Ray Adams лишним ничего не будет :-)

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Напомни завтра, с работы выложу пример

Добавлено спустя 10 часов, 3 минуты, 33 секунды:
http://cp.people.overclockers.ru/cgi-bi ... Simply.rar
250kb


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Ray Adams Решил я поэкспериментировать. Использую шейдер из примера, на который ты дал ссылку, все нормально. Но тут решил сочитать с наложением текстуры, в итоге если накладываю шейдер, то с поверхности пропадает текстура, я чего-то непонимаю :-) Как это обойти?

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 20.06.2003
Откуда: Ижевск
Daemon
там в шейдере накладывается только цвет, приплюсуй в конце шейдера текстуру примерно так:

в переменных:
vec4 color = texture2D(TextureUnit0,gl_TexCoord[0].st);


и в конце:
gl_FragColor = (color*diffuse)+ (Cs*specular)+Ca;

таким макаром можешь хоть 16 текстур наложить... правда, в любом шейдере это должен делать ТЫ сам :)
клёво же, полный контроль :)


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Daemon Это уже не ко мне, я не большой спец в шейдерах :)


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Ray Adams жаль.
awl можно помедленее, я записую. Что в вертексный, что во фрагментный? Что есть TextureUnit0, gl_TexCoord[0].st -= ругаеться.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 20.06.2003
Откуда: Ижевск
Daemon
Ну вот примерно так должно быть, TextureUnit0 это параметр, передаваемый
из твоей проги в шейдер (хэндл текстуры в 1i формате)

Вертексный:

const vec4 AMBIENT = vec4( 0.1, 0.1, 0.1, 1.0 );
const vec4 SPECULAR = vec4( 1.0, 1.0, 1.0, 1.0 );

varying vec4 Ca;
varying vec4 Cd;
varying vec4 Cs;

varying vec4 V_eye;
varying vec4 L_eye;
varying vec4 N_eye;

void main(void)
{
V_eye = gl_ModelViewMatrix * gl_Vertex;
L_eye = gl_LightSource[0].position - V_eye;
N_eye = vec4(gl_NormalMatrix * gl_Normal, 1.0);

gl_Position = gl_ProjectionMatrix * V_eye;
V_eye = -V_eye;

gl_TexCoord[0] = gl_MultiTexCoord0;

Ca = AMBIENT;
Cd = gl_Color;
Cs = SPECULAR;
}


Фрагмент-шейдер:


varying vec4 Ca;
varying vec4 Cd;
varying vec4 Cs;
varying vec4 V_eye;
varying vec4 L_eye;
varying vec4 N_eye;
uniform sampler2D TextureUnit0;

void main(void)
{
vec3 V = normalize(vec3(V_eye));
vec3 L = normalize(vec3(L_eye));
vec3 N = normalize(vec3(N_eye));
vec4 color = texture2D(TextureUnit0,gl_TexCoord[0].st);

float diffuse = clamp(dot(L, N), 0.0, 1.0);

vec3 H = normalize(L + V);
float specular = clamp(pow(dot(N, H), 128.0), 0.0, 1.0);

gl_FragColor = (color*diffuse)+ (Cs*specular)+Ca;
}



Добавлено спустя 5 минут, 6 секунд:
А вообще, я плюнул на GLSL :( некоторые шейдеры после подключения упорно отказываются правильно работать,
так и не понял в чём проблема, в Shader Designer всё нормально. Может компилятор GLSL глючит... правильнее
наверное использовать ARB_fragment_program вместо этих новомодных языков (примеры шейдеров можно
надёргать из дум3, фар край, хроник риддика)


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Спасибо, буду плясать с бубном и пытаться передать параметры :-) Шейдеры - это конечно весчь хорошая, но уж больно хлопотная. Сколько компиляторов, стандартов, голова круго идет.

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
Цитата:
Сколько компиляторов, стандартов, голова круго идет.

Вот вот, но это все под OGL, а в D3D то дело попроще будет :).

awl В принципе ничего не мешает скомпилировать потом HLSL на ассемблерный ARB вариант и пототм уже применять. Благо компиляторы есть. Просто с HLSL видимо разрабы дров (NV и ATI) так толком и не договорились, что да как надо делать чтобы работало одинаково везде.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Хм, вопрос следующего плана, никто не встречал пример с молнией, с шейдерами или без, но только не тот который на www.suleco.co.za. Очень надо, найти не могу :-(

_________________
Ку ку


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 37 • Страница 2 из 2<  1  2
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan