"неверная директива препроцессора" в фрагментном шейдере? - PullRequest
1 голос
/ 14 июня 2019

Я делаю 2 шейдера (файл .frag) и получаю сообщение об ошибке «ERROR: 0:83: '': синтаксическая ошибка: неверная директива препроцессора».и когда я нажимаю «ОК», он не отображается, и модели не появляются, и я думаю, что другие шейдеры не работают.Странно только изображения показывают, но не модели.почему это происходит?

Шейдер 1:

#version 120
#define PI 3.14159265

varying vec3 position;
varying vec3 normal;
varying vec4 color;
varying vec2 textureCoord;
varying vec2 imageCoord;

uniform float time;
uniform float beat;
uniform vec2 resolution;
uniform vec2 textureSize;
uniform vec2 imageSize;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 perspectiveMatrix;
uniform mat4 textureMatrix;
uniform sampler2D sampler0;
uniform sampler2D sampler1;

vec2 img2tex( vec2 v ) { return v / textureSize * imageSize; }



float amount = 0.3;

float random(float x) 
{ 
    return fract(sin(x) * 10000.);          
}

float noise(vec2 p) 
{
    return random(p.x + p.y * 10000.);            
}

vec2 sw(vec2 p) { return vec2(floor(p.x), floor(p.y)); }
vec2 se(vec2 p) { return vec2(ceil(p.x), floor(p.y)); }
vec2 nw(vec2 p) { return vec2(floor(p.x), ceil(p.y)); }
vec2 ne(vec2 p) { return vec2(ceil(p.x), ceil(p.y)); }

float smoothNoise(vec2 p) 
{
    vec2 interp = smoothstep(0., 1., fract(p));
    float s = mix(noise(sw(p)), noise(se(p)), interp.x);
    float n = mix(noise(nw(p)), noise(ne(p)), interp.x);
    return mix(s, n, interp.y);        
}

float fractalNoise(vec2 p) 
{
    float x = 0.;
    x += smoothNoise(p      );
    x += smoothNoise(p * 2. ) / 2.;
    x += smoothNoise(p * 4. ) / 4.;
    x += smoothNoise(p * 8. ) / 8.;
    x += smoothNoise(p * 16.) / 16.;
    x /= 1. + 1./2. + 1./4. + 1./8. + 1./16.;
    return x;            
}

float movingNoise(vec2 p) 
{ 
    float x = fractalNoise(p + time);
    float y = fractalNoise(p - time);
    return fractalNoise(p + vec2(x, y));    
}

float nestedNoise(vec2 p) 
{    
    float x = movingNoise(p);
    float y = movingNoise(p + 100.);
    return movingNoise(p + vec2(x, y));    
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy / imageSize.xy;
    float n = nestedNoise(uv * 6.) * 1.0;
    float offset = mix(0.0, 2.0, amount);

    #if NORM_FOCUS
      vec2 offsetVector = normalize(vec2(0.5, 0.5) - uv) * (n * offset);
    #else
      vec2 offsetVector = (vec2(0.5, 0.5) - uv) * (n * offset);
    #endif

    fragColor = texture2D(sampler0, img2tex(uv) + offsetVector);
}

void main()
{
    mainImage(gl_FragColor.rgba, gl_FragCoord.xy);
}

Шейдер 2:

#version 120
#define PI 3.14159265

varying vec3 position;
varying vec3 normal;
varying vec4 color;
varying vec2 textureCoord;
varying vec2 imageCoord;

uniform float time;
uniform float beat;
uniform vec2 resolution;
uniform vec2 textureSize;
uniform vec2 imageSize;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 perspectiveMatrix;
uniform mat4 textureMatrix;
uniform sampler2D sampler0;
uniform sampler2D sampler1;

vec2 img2tex( vec2 v ) { return v / textureSize * imageSize; }



float amount = 0.9;

float random(float x) 
{ 
    return fract(sin(x) * 10000.);          
}

float noise(vec2 p) 
{
    return random(p.x + p.y * 10000.);            
}

vec2 sw(vec2 p) { return vec2(floor(p.x), floor(p.y)); }
vec2 se(vec2 p) { return vec2(ceil(p.x), floor(p.y)); }
vec2 nw(vec2 p) { return vec2(floor(p.x), ceil(p.y)); }
vec2 ne(vec2 p) { return vec2(ceil(p.x), ceil(p.y)); }

float smoothNoise(vec2 p) 
{
    vec2 interp = smoothstep(0., 1., fract(p));
    float s = mix(noise(sw(p)), noise(se(p)), interp.x);
    float n = mix(noise(nw(p)), noise(ne(p)), interp.x);
    return mix(s, n, interp.y);        
}

float fractalNoise(vec2 p) 
{
    float x = 0.;
    x += smoothNoise(p      );
    x += smoothNoise(p * 2. ) / 2.;
    x += smoothNoise(p * 4. ) / 4.;
    x += smoothNoise(p * 8. ) / 8.;
    x += smoothNoise(p * 16.) / 16.;
    x /= 1. + 1./2. + 1./4. + 1./8. + 1./16.;
    return x;            
}

float movingNoise(vec2 p) 
{ 
    float x = fractalNoise(p + time);
    float y = fractalNoise(p - time);
    return fractalNoise(p + vec2(x, y));    
}

float nestedNoise(vec2 p) 
{    
    float x = movingNoise(p);
    float y = movingNoise(p + 100.);
    return movingNoise(p + vec2(x, y));    
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy / imageSize.xy;
    float n = nestedNoise(uv * 6.) * 1.0;
    float offset = mix(0.0, 2.0, amount);

    #if NORM_FOCUS
      vec2 offsetVector = normalize(vec2(0.5, 0.5) - uv) * (n * offset);
    #else
      vec2 offsetVector = (vec2(0.5, 0.5) - uv) * (n * offset);
    #endif

    fragColor = texture2D(sampler0, img2tex(uv) + offsetVector);
}

void main()
{
    mainImage(gl_FragColor.rgba, gl_FragCoord.xy);
}

Я ожидал, что это сработает, но это не так.

1 Ответ

2 голосов
/ 14 июня 2019

У вас есть это в вашем первом фрагментном шейдере:

#if NORM_FOCUS  // line 83
  vec2 offsetVector = normalize(vec2(0.5, 0.5) - uv) * (n * offset);
#else
  vec2 offsetVector = (vec2(0.5, 0.5) - uv) * (n * offset);
#endif

В отсутствие какого-либо другого кода я не вижу, чтобы NORM_FOCUS был #define d где-либо, что противоречит следующему ( GLSL 1.20 Спецификация , стр. 7):

Выражения, следующие за #if и #elif, ограничены выражениями, работающими с литеральными целочисленными константами, плюс идентификаторы, используемые оператором defined.

Так что либо #define NORM_FOCUS к чему-либо, либо к #ifdef NORM_FOCUS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...