OpenGLES:版本指令或扩展指令,哪个先出现?

时间:2019-05-05 19:56:58

标签: android opengl-es glsl shader

这是我的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

那么哪个顺序是正确的?怎样才能在模拟器和真实设备上编译代码?这可能会成为带有其他GPU的其他现实设备的问题吗?能够针对所有(或大多数)设备的最佳实践是什么?

编辑:请注意,Android模拟器上的错误表示该错误发生在着色器代码的第三行而不是第二行。我仔细检查了所有内容,并且着色器代码中没有空行。扩展指令位于第二行。

0 个答案:

没有答案