HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- OpenGL (https://hlfx.ru/forum/forumdisplay.php?forumid=7)
-- Избавиться от cg.dll (https://hlfx.ru/forum/showthread.php?threadid=1551)
Отправлено Ku2zoff 19-10-2008 в 03:57:
Избавиться от cg.dll
Назрел вопрос: у нас имеются дллки cg.dll и cgGL.dll Спомощью них шейдеры читаются программой. Хотелось бы поместить шейдеры в код клиентской дллки(как это сделано в ксаше - преломления на воде, чёрно-белый экран и т.п.), чтобы не использовать cg. Подскажите плз. есть ли конвертеры для cg в нужный язык, и что ещёнужно делать.
Отправлено XaeroX 19-10-2008 в 11:08:
Компилируй их компилятором cgc в профайлы arbvp (вершинные) и arpfp (пиксельные). Получится код, как в ксаше (комментарии, начинающиеся с #, можно вырезать). А дальше грузишь так же, как в ксаше.
Добавлено 19-10-2008 в 18:08:
Забавно читать тему именно в день принятия мной решения отказаться от скомпилированных шейдеров и использовать дллки Cg.
__________________
Отправлено Ku2zoff 24-10-2008 в 11:58:
Компилирую шейдер. Командная строка выглядит так:
Логичный вопрос: что делать?
Отправлено ZONER 24-10-2008 в 12:05:
Я конечно этим компилятром никогда не пользовался. Но если перевести с английского, она жалуется, что у тебя не определена программа, которая должна быть откомпилена.
__________________
Сложно обьяснить, проще сделать (C) (_-=Zheka=-_)
Отправлено Government-Man 24-10-2008 в 12:15:
ZONER гениально!!!
Ku2zoff может надо имя файла перед параметрами писать? )
Отправлено Ku2zoff 24-10-2008 в 12:29:
Government-Man не помогает. Тут похоже дело в коде шейдера.
Отправлено ZONER 24-10-2008 в 12:46:
Я могу открыть темку на форуме developer.nvidia.com по твоему вопросу. Может быть там ответ у кого-нибудь выудим.
З.Ы.
А там в документации по компилятору ничего не написано, что надо вписывать имя функции, исходя из которой код компилится? А то в HLSL компиляторе была такая фигня...
__________________
Сложно обьяснить, проще сделать (C) (_-=Zheka=-_)
Отправлено Ku2zoff 24-10-2008 в 13:41:
ZONER я ничего никогда не понимаю в документациях. Сколько не ищу, найти не могу. Для меня лучше всего "живой пример"
Отправлено ZONER 24-10-2008 в 14:46:
Короче я нашел выход из создавшейся поблемы. пишешь так:
cgc.exe -profile <профиль> -entry <имя основной функции> -o <здесь имя исходного кода и не более!>
Пример:
cgc.exe -profile arbfp1 -entry main_fp -o main.cg
Ветку дискусси этой проблемы можешь найти здесь: http://developer.nvidia.com/forums/...tart=#entry6300
__________________
Сложно обьяснить, проще сделать (C) (_-=Zheka=-_)
Отправлено Ku2zoff 24-10-2008 в 15:09:
ZONER как только я увидел параметр -entry main_fp до меня дошло. Что надо было писать не FragmentProgram(это имя функции просто для примера, а имя функции, шо присутствует в шейдере, т.е. просто main)
Cg Pixel Shader:
5 | float2 tex0 : TEXCOORD0; |
6 | float2 tex1 : TEXCOORD1; |
7 | float2 tex2 : TEXCOORD2; |
8 | float2 tex3 : TEXCOORD3; |
16 | FragOut [color=red]main[/color](VertOut vin, |
17 | uniform samplerRECT tex0 : TEXUNIT0, |
18 | uniform samplerRECT tex1 : TEXUNIT1, |
19 | uniform samplerRECT tex2 : TEXUNIT2, |
20 | uniform samplerRECT tex3 : TEXUNIT3) |
24 | float4 col1 = texRECT(tex0, vin.tex0) *0.125f;/// 2.0f; |
25 | float4 col2 = texRECT(tex1, vin.tex1) *0.875f;/// 2.0f; |
26 | float4 col3 = texRECT(tex2, vin.tex2) *0.125f;/// 2.0f; |
27 | float4 col4 = texRECT(tex3, vin.tex3) *0.875f;/// 2.0f; |
29 | float4 avg1 = (col1 + col2) / 2.0f; |
30 | float4 avg2 = (col3 + col4) / 2.0f; |
32 | fout.col = avg1 + avg2; |
Отправлено ZONER 24-10-2008 в 15:13:
А что на счет компиляции? Откомпилировалось? Просто мне самому интересно
__________________
Сложно обьяснить, проще сделать (C) (_-=Zheka=-_)
Отправлено Ku2zoff 24-10-2008 в 15:18:
Откомпилировалось. Вышеуказанный шейдер теперь выглядит вот так:
C++ Source Code:
2 | PARAM c[1] = { { 0.125, 0.875, 0.5 } }; |
6 | TEX R1, fragment.texcoord[3], texture[3], RECT; |
8 | TEX R1, fragment.texcoord[2], texture[2], RECT; |
9 | TEX R0, fragment.texcoord[1], texture[1], RECT; |
10 | MAD R2, R1, c[0].x, R2; |
12 | TEX R0, fragment.texcoord[0], texture[0], RECT; |
13 | MAD R0, R0, c[0].x, R1; |
15 | MUL result.color, R0, c[0].z; |
Отправлено ZONER 24-10-2008 в 15:27:
Хотя бы одному человеку помог с проблемой Если что понадобится еще, можешь в аську мне стучать.
__________________
Сложно обьяснить, проще сделать (C) (_-=Zheka=-_)
Отправлено Ku2zoff 24-10-2008 в 16:50:
Шейдеры скомпилированы. Осталась малнькая неувязочка. ЦГшные функции нужно полностью убрать. Но им нужна альтернатива. Чем их заменить?
C++ Source Code:
cgGLSetStateMatrixParameter |
Вроде бы пока всё.
Отправлено ZONER 24-10-2008 в 17:18:
а ты можешь собственные написать. Вот, например как у меня было, когда я писал собственный движок:
C++ Source Code:
1 | void sendMat4(const String &name, const Mat4 &value); |
2 | void sendVec4(const String &name, const Vec4 &value); |
3 | void sendVec3(const String &name, const Vec3 &value); |
4 | void sendVec2(const String &name, const Vec2 &value); |
5 | void sendFloat(const String &name, float value); |
6 | void sendInt(const String &name, int value); |
C++ Source Code:
1 | void GLShader::sendMat4(const String &name, const Mat4 &value) { |
2 | GLint param = glGetUniformLocationARB(program, name.c_str()); |
3 | glUniformMatrix4fvARB(param, 1, false, value); |
6 | void GLShader::sendVec4(const String &name, const Vec4 &value) { |
7 | GLint param = glGetUniformLocationARB(program, name.c_str()); |
8 | glUniform4fvARB(param, 1, value); |
11 | void GLShader::sendVec3(const String &name, const Vec3 &value) { |
12 | GLint param = glGetUniformLocationARB(program, name.c_str()); |
13 | glUniform3fvARB(param, 1, value); |
16 | void GLShader::sendVec2(const String &name, const Vec2 &value) { |
17 | GLint param = glGetUniformLocationARB(program, name.c_str()); |
18 | glUniform2fvARB(param, 1, value); |
21 | void GLShader::sendFloat(const String &name, float value) { |
22 | int param = glGetUniformLocationARB(program, name.c_str()); |
23 | glUniform1fARB(param, value); |
26 | void GLShader::sendInt(const String &name, int value) { |
27 | int param = glGetUniformLocationARB(program, name.c_str()); |
28 | glUniform1iARB(param, value); |
Это пример написания, если ты пишешь шейеры на языке GLSL.
Не совсем уверен, но может быть и для ассемблерных шейдеров подойдет.
Если надо то могу все функции описать, что да как работает.__________________
Сложно обьяснить, проще сделать (C) (_-=Zheka=-_)