将着色器移植到SFML

时间:2019-05-29 18:10:56

标签: c++ glsl shader sfml fragment-shader

我对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”,并插入了一个无效的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

0 个答案:

没有答案