Портирование шейдера в SFML - PullRequest
0 голосов
/ 29 мая 2019

У меня нет большого опыта работы с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...