Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Я вот тоже дошел до того, что понадобились шейдеры в OpenGL под Delphi, никто не подскажет как прикрутить шейдер написаный в RenderMonkey к OpenGL?
Или может быть небольшой пример использования шейдера(очень надо, а времени в обрез )
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Daemon Не так и сложно его присобчаивать. Создаеш его там в режиме OGL обязательно, далее избавляешся по надобности от переменных, только если они конечно тебе будут нужны. Далее просто. Тебе понадобится обновленный gl юнит для Delphi. Самый лучший на данный момент dglOpenGL.pas, там есть описание всех нужных тебе расширений.
Вот список минимально необходимых.
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);
Это куски кода из 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 Решил я поэкспериментировать. Использую шейдер из примера, на который ты дал ссылку, все нормально. Но тут решил сочитать с наложением текстуры, в итоге если накладываю шейдер, то с поверхности пропадает текстура, я чего-то непонимаю Как это обойти?
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);
Добавлено спустя 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. Очень надо, найти не могу
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения