У меня нет большого опыта работы с Shader или GLSL.Я пытаюсь попрактиковаться с ними.Для этого я пытаюсь портировать этот шейдер.https://www.shadertoy.com/view/XsXGR7 В проект для использования с SFML.У меня возникла проблема с этим, и я не уверен, что делать, чтобы начать устранять проблемы.
Я возился с униформой и несколькими переменными, но сам шейдер продолжает выдавать одно и то же сообщение об ошибке.Это не скомпилируется.Не уверен, почему, я предполагаю, что это потому, что без преобразования его для работы с SFML он запрашивает ввод из OpenGL.
Файл шейдера
uniform vec3 iResolution; // viewport resolution (in pixels)
uniform float iTime; // shader playback time (in seconds)
uniform float iTimeDelta; // render time (in seconds)
uniform int iFrame; // shader playback frame
uniform float iChannelTime[4]; // channel playback time (in seconds)
uniform vec3 iChannelResolution[4]; // channel resolution (in pixels)
uniform vec4 iMouse; // mouse pixel coords. xy: current (if MLB down), zw: click
uniform samplerXX iChannel0..3; // input channel. XX = 2D/Cube
uniform vec4 iDate; // (year, month, day, time in seconds)
uniform float iSampleRate; // sound sample rate (i.e., 44100)
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec3 waveParams = vec3( 10.0, 0.8, 0.1 );
vec2 tmp = vec2( iMouse.xy / iResolution.xy );
vec2 uv = fragCoord.xy / iResolution.xy;
vec2 texCoord = uv;
float distance = distance(uv, tmp);
if ( (distance <= ((iTime ) + waveParams.z )) && ( distance >= ((iTime ) - waveParams.z)) )
{
float diff = (distance - (iTime));
float powDiff = 1.0 - pow(abs(diff*waveParams.x), waveParams.y);
float diffTime = diff * powDiff;
vec2 diffUV = normalize(uv - tmp);
texCoord = uv + (diffUV * diffTime);
}
vec4 original = texture( iChannel0, texCoord);
fragColor = original;
}
В настоящее время все шейдеры загружаются в.
shader.loadFromFile("ASSETS/SHADERS/Shockwave1.txt",sf::Shader::Fragment);
//load the shader
if (!shader.isAvailable()) {
std::cout << "The shader is not available\n";
}
Сообщение об ошибке при попытке загрузить вышеуказанный шейдер.Не задано ни одной формы, ничего не делается с шейдером, кроме его загрузки.
Failed to compile fragment shader:
WARNING: 0:1 '' : #version directive missing
ERROR: 0:8 'iChannel0 : syntax error syntax error
Редактировать:
Заменив «samplerXX» на «sampler2D» и вставив функцию void main () вшейдер загружается правильно.Получение кода для работы теперь является проблемой.
Main ()
void main(out vec4 fragColor, in vec2 fragCoord )
{
vec3 waveParams = vec3( 10.0, 0.8, 0.1 );
vec2 tmp = vec2( iMouse.xy / iResolution.xy );
vec2 uv = fragCoord.xy / iResolution.xy;
vec2 texCoord = uv;
float distance = distance(uv, tmp);
if ( (distance <= ((iTime ) + waveParams.z )) && ( distance >= ((iTime ) - waveParams.z)) )
{
float diff = (distance - (iTime));
float powDiff = 1.0 - pow(abs(diff*waveParams.x), waveParams.y);
float diffTime = diff * powDiff;
vec2 diffUV = normalize(uv - tmp);
texCoord = uv + (diffUV * diffTime);
}
vec4 original = texture( iChannel0, texCoord);
fragColor = original;
}
Это приводит к этим ошибкам
Failed to compile fragment shader:
WARNING: 0:1: '' : #version directive missing
WARNING: 0:32: 'function' : is not available in current GLSL version texture
ERROR: 0:34: 'main' : function cannot take any parameter(s)
WARNING: 0:53: 'function' : is not available in current GLSL version texture
В то время как основной, не принимающий параметры, прост.Я хотел бы знать, будут ли значения передаваться строго в униформе?Я не уверен, с чем связаны ошибки «функции».
Редактировать:
Main ()
void main( )
{
vec2 fragCoord = vec2(20,20);
vec3 waveParams = vec3( 10.0, 0.8, 0.1 );
vec2 tmp = vec2( iMouse.xy / iResolution.xy );
vec2 uv = fragCoord.xy / iResolution.xy;
vec2 texCoord = uv;
float distance = distance(uv, tmp);
if ( (distance <= ((iTime ) + waveParams.z )) && ( distance >= ((iTime ) - waveParams.z)) )
{
float diff = (distance - (iTime));
float powDiff = 1.0 - pow(abs(diff*waveParams.x), waveParams.y);
float diffTime = diff * powDiff;
vec2 diffUV = normalize(uv - tmp);
texCoord = uv + (diffUV * diffTime);
}
vec4 original = texture( iChannel0, texCoord);
gl_FragColor = original;
}
Удаление основных параметров, жесткий код, определяющий vec2 fragCoord как vec2(20,20) заставили шейдер работать без проблем.Мой вопрос сейчас достаточно ли для вывода эффекта шейдера?(Небольшой опыт работы с glsl, извините, если это глупый вопрос)
gl_FragColor = original;
И если это так, то, похоже, это позиция пикселя, который нужно заштриховать.Есть ли способ передать это автоматически?
vec2 fragCoord