Освещение в Android, OpenGL ES 3.0

Это мой первый вопрос. Дело в том, что я программирую приложение для OpenGL ES в Android Studio, и у меня возникли некоторые проблемы. Похоже, что огни работают на эмуляторе, но при сборке APK и его установке на реальном устройстве (с Android 5.0, с opengl es версией 3.0 и поддержкой glsl es 3.00) это выглядит странно:

Эмулятор, Android Studio Emulator

Телефон: Телефон

Похоже, что освещение не сделано ни фрагмент по телефону или что-то, я не знаю, что происходит. Вот шейдеры:

#version 300 es
uniform mat4 M;
uniform mat4 V;
uniform mat4 P;
uniform int boolGUI;
uniform float opacity;
uniform float blackness;
in vec3 vPosition;
in vec2 vUV;
in vec3 vNormal;
//"in vec3 vColor;" +
//Lights
uniform mat4 lMat;
out mat4 frLMat;

out vec3 frColor;
out vec3 frNormalCam;
//out vec3 frLightCam;
out vec3 frEyeCam;
out vec2 oUV;
out float z;
flat out int frBoolGUI;
flat out float frOpacity;
flat out float frBlackness;
out vec3 frPos;
out mat4 frV;

void main() {
mat4 uMVPMatrix = P * V * M;
vec4 vPos;
vPos.xyz = vPosition;
vPos.w = 1.0;
gl_Position = uMVPMatrix * vPos;
frColor = vec3(1.0,1.0,1.0);
//vec3 light = vec3(0.3,-0.3,-0.4);
vec3 light = normalize(vec3(-0.1,-0.3,0.2))*0.6;
light = normalize(-vPos.xyz+vec3(0.0,0.0,1.0));
//frLightCam = (V * vec4(light,0)).xyz;
//frNormal = vNormal;
frNormalCam = ( V * M * vec4(normalize(vNormal),0)).xyz;
frEyeCam = (V*vec4(0,-3,2.5,0)).xyz;

oUV = vUV.xy;
z = vPos.z;
frBoolGUI = boolGUI;
frOpacity = opacity;
frBlackness = blackness;
frPos = (M*vPos).xyz;
frV = V;

frLMat=lMat;
}

И фрагмент шейдера:

#version 300 es
precision mediump float;
in vec3 frColor;
in vec3 frNormalCam;
//in vec3 frLightCam;
in vec3 frEyeCam;
in vec3 frPos;
in vec2 oUV;
in float z;
flat in int frBoolGUI;
flat in float frOpacity;
flat in float frBlackness;
//vec3 l = vec3(1.0,0.1,-0.2);
out vec4 FragColor;
in mat4 frV;
in mat4 frLMat;

uniform sampler2D myTextureSampler;


void main() {

float att = 0.0;
//for(int i=0;i<4;i++) {
int i=0;
if(frLMat[i][3]>0.0) {
    vec3 li=frLMat[i].xyz;
    vec3 lightVec = -frPos.xyz+li;//vec3(0.0,-0.5,1.5);
    vec3 light = normalize(lightVec)*0.6;
    vec3 frLightCam = (frV * vec4(light,0)).xyz;


   float lightAtt = 0.6/(length(lightVec))+0.4;
    float ambient = 0.40;

   vec3 E = normalize(frEyeCam);
   vec3 R = reflect(-frLightCam,frNormalCam);

   float cosAlpha = clamp( dot( E,R ), 0.0,1.0 );
   float spec = pow(cosAlpha,4.0)*5.0;
   att += ((spec + clamp( dot(frNormalCam,frLightCam)*(1.0-ambient), 0.0,1.0 ))*lightAtt+ambient)*frLMat[i].w;
  }
 //}

//if(z>1.7) att = att-(z-1.7)*1.7;
//if(frPos.y>2.0) att = att-abs((frPos.y-2.0)*1.7);
FragColor.xyz = texture( myTextureSampler, oUV ).rgb * att;//*lightAtt;// frColor * att;
FragColor.w=texture(myTextureSampler,oUV).w;
vec3 gamma = vec3(1.0/0.85);
gamma = vec3(1.0/0.8);
FragColor.xyz = pow(FragColor.xyz,gamma)*(frBlackness+vec3(0.05))+vec3(0.06);

FragColor.a = frOpacity;
if (frBoolGUI==1) FragColor = texture(myTextureSampler,oUV);
}

(Прошу прощения за неуклюжий код, сейчас я только тестирую).

Любая помощь будет оценена

0 ответов

Другие вопросы по тегам