OpenGLES: директива версии или директива расширения, которая на первом месте? - PullRequest
0 голосов
/ 05 мая 2019

Это мой фрагментный шейдерный код OpenGLES GLSL:

#extension GL_OES_standard_derivatives : enable
#version 310 es
precision highp float;

vec3 renderNormalMap(vec3 vWorldPosition, vec3 vNormal, sampler2D normalMap, vec2 vUv) {
    vec3 tangent_normal = texture(normalMap, vUv).xyz * 2.0 - 1.0;

    vec3 Q1  = dFdx(vWorldPosition);
    vec3 Q2  = dFdy(vWorldPosition);
    vec2 st1 = dFdx(vUv);
    vec2 st2 = dFdy(vUv);
    vec3 T  = normalize(Q1*st2.t - Q2*st1.t);
    vec3 B  = -normalize(cross(vNormal, T));
    mat3 TBN = mat3(T, B, vNormal);

    return vec3(normalize(TBN * tangent_normal));
}

uniform sampler2D albedo;
uniform sampler2D normalMap;
uniform vec3 specular;
uniform float roughness;

in vec2 vUv;
in vec3 vNormal;
in vec4 vPosition;

layout(location = 0) out vec4 fragColor;
layout(location = 1) out vec4 fragNormal;
layout(location = 2) out vec4 fragPosition;
layout(location = 3) out vec4 fragSpecular;

void main() {
    fragColor = vec4(texture(albedo, vUv).xyz, 1.0);
    fragNormal = vec4(renderNormalMap(vPosition.xyz, vNormal, normalMap, vUv), 1.0);
    fragPosition = vPosition;
    fragSpecular = vec4(specular, roughness);
}

Это прекрасно компилируется на эмуляторе Android, но когда я пытаюсь скомпилировать на моем реальном устройстве, я получаю эту ошибку:

0:2: P0005: #version must be the first directive/statement in a program

Итак, я переключил первые две строки в коде шейдера, и он работает на реальном устройстве.Если я снова пытаюсь скомпилировать шейдерный код на эмуляторе, я получаю следующую ошибку:

0(3) : error C7621: #extension directive must occur before any non-preprocessor token

Так какой порядок правильный?И как я могу получить код для компиляции на эмуляторе и на реальных устройствах?Может ли это стать проблемой для других реальных устройств с другими графическими процессорами?Что считается наилучшей практикой, чтобы иметь возможность нацеливаться на все (или большинство) устройств?

РЕДАКТИРОВАТЬ: Обратите внимание, что ошибка в эмуляторе Android означает, что ошибка возникает в 3-й строке кода шейдера вместо 2-го,Я дважды проверил все, и в коде шейдера нет ни одной пустой строки.Директива расширения находится во 2-й строке.

...