Это мой фрагментный шейдерный код 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-й строке.