Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Вниз

OpenGL. Модуль для работы с шейдерами.   Найти похожие ветки 

 
@!!ex ©   (2007-06-30 21:52) [0]

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

unit Shaders;

interface
uses OpenGL, Classes, SysUtils, Dialogs, OGLExt;

type
TShaderObject = class
 public
   Constructor Create(VSFileName,FSFileName:string);
   Procedure   SetShader; virtual;
   Procedure   ResetShader;
 protected
   VS, FS, SP: integer;
   UseVS, UseFS:boolean;
 end;

implementation
{ TShaderObject }

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

function 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;
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
     raise Exception.Create(log);
   end;
end;

function LoadShaderFromFile(const filename: String; const stype: GLenum): GLhandleARB;
var
 txt: TStringList;
 F:TTextFile;
begin
   txt := TStringList.Create;
   txt.LoadFromFile(filename);
   try
     Result := LoadShader(txt.Text, stype);
   except on E: Exception do
     raise Exception.Create(filename + " contains errors!" + #10 + e.Message);
   end;

   txt.Free;
end;

constructor TShaderObject.Create(VSFileName, FSFileName: string);
begin
 if CanUseShaders then
 begin
   if Length(VSFileName)>0 then if FileExists(VSFileName) then UseVS:=True else UseVS:=False;
   if Length(FSFileName)>0 then if FileExists(FSFileName) then UseFS:=True else UseFS:=False;

   SP:=glCreateProgramObjectARB();

   if UseVS then
   begin
     VS:=LoadShaderFromFile(VSFileName,GL_VERTEX_SHADER_ARB);
     glAttachObjectARB(SP,VS);
   end;

   if UseFS then
     begin
     FS:=LoadShaderFromFile(FSFileName,GL_FRAGMENT_SHADER_ARB);
     glAttachObjectARB(SP,FS);
   end;

   glLinkProgramARB(SP);
 end;
end;

procedure TShaderObject.ResetShader;
begin
 if CanUseShaders then
   glUseProgramObjectARB(0);
end;

procedure TShaderObject.SetShader;
begin
 if CanUseShaders then
   glUseProgramObjectARB(SP);
end;

end.


Не вижу смысла писать здесь целый пример. Поскольку все элементарно.
CanUseShaders - глобальная переменная, указывающая, можно ли юзать шейдеры.
У меня она выставляется в true если видуха и драйвера поддерживают шейдеры.
Constructor Create(VSFileName,FSFileName:string); - загружает из файлов шейдеры. Теоретически можно не указывать
Procedure   SetShader; - делает шейдер активным.
Procedure   ResetShader; - сбасывает шейдеры. Используется стандартная обработка. Для сброса можно вызывать метод любого шейдера.

Понятно что это базоый класс, который можно использовать только для простых шейдеров.
Или для порождения новых, более мощных.
К сожалению сейчас не могу представить рабочий вариант унаследованного шейдера.
Но там все элементарно, просто вводятся дополнительные возможности для передачи значений на конвеер.


 
@!!ex ©   (2007-06-30 21:54) [1]

Constructor Create(VSFileName,FSFileName:string); - загружает из файлов шейдеры. Теоретически можно не указывать
один из шейдеров, тогда дложен использоваться стандартный, но везде где я это пытался оттестировать шейдеры переставали работать вообще.
Так что лучше шейдеры загружать парами. У меня для этих целей лежит Default.vs Default.fs их и юзаю.


 
Yashin ©   (2007-07-02 20:51) [2]

Из одного файла прикольнее


 
@!!ex ©   (2007-07-02 21:49) [3]

> [2] Yashin ©   (02.07.07 20:51)

не понял.. Geometric шейдеры имеете ввиду?


 
Jkot ©   (2007-07-04 16:46) [4]

> @!!ex ©   (02.07.07 21:49) [3]
2 файла запихиваюся в один и ставится разбиение к примеру [fp][vp] вот и всё 2 программы в 1 =)


 
@!!ex ©   (2007-07-04 19:05) [5]

> [4] Jkot ©   (04.07.07 16:46)

А смысл? Ведь они могут использоваться в разных комбинациях.


 
Jkot ©   (2007-07-05 06:07) [6]

Многие так делают... Честно не знаю кому как нравится, я ведь только пояснил что именнно по моему мнению Yashin хотел сказать.


 
Yashin ©   (2007-07-08 16:55) [7]

>А смысл? Ведь они могут использоваться в разных комбинациях.
Мне их так отлаживать легче



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
4-1224487927
worldmen
2008-10-20 11:32
2009.12.06
Вывести список компонент чужого окна.


2-1255952808
Fedor
2009-10-19 15:46
2009.12.06
Нажать кнопку ОК в javascript окне WebBrowser а


2-1255954503
Ivan8511
2009-10-19 16:15
2009.12.06
Разница между ADOTable и ADOQuery


2-1256015020
Роман
2009-10-20 09:03
2009.12.06
DBF to DB


2-1255947778
Инна
2009-10-19 14:22
2009.12.06
Дерево каталогов&amp;список файлов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский