OpenGL ES 2.0-3.0 эквивалент gl_LightSource?

Я пытаюсь преобразовать вершинный шейдер для работы на iOS 7, но не могу понять, каким должен быть эквивалент gl_LightSource [0] .position.xyz.

Вот вершинный шейдер OpenGL ES 1.0

Я заменил весь материал gl_xxx на унифицированный mat4 / vec4 и т. Д., Который я могу передать из своего кода, но я не знаю, что делать с этой строкой

vec4 eyeLightPos = gl_LightSource [0] .position;


Вот код вершинного шейдера, который нужно преобразовать

 varying vec3 N;
 varying vec3 L;
 varying vec3 E;
 attribute float meanK;
 attribute float meanKS;
 attribute float gaussian;
 attribute float gaussianS;
 varying float meanCurvature;
 attribute float keyAttrib;
 attribute float keyUni;
 varying float keyShader;
 attribute float cuSS;
 varying float cuSSF;
 attribute float guSS;
 varying float guSSF;
 void main() {
       gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
       vec4 eyePosition = gl_ModelViewMatrix * gl_Vertex;
       vec4 eyeLightPos = gl_LightSource[0].position;
       N = normalize(gl_NormalMatrix * gl_Normal); L = eyeLightPos.xyz - eyePosition.xyz;
       E = -eyePosition.xyz;
       if(keyAttrib == 0.0)
             meanCurvature = meanK;
       if(keyAttrib == 1.0)
             meanCurvature = meanKS;
       if(keyAttrib == 2.0)
             meanCurvature = gaussian;
       if(keyAttrib == 3.0)
             meanCurvature = gaussianS;
       keyShader = keyUni;
       cuSSF = cuSS;
       guSSF = guSS;
}

Вот код фрагментного шейдера

varying vec3 N;
varying vec3 L;
varying vec3 E;
varying float meanCurvature;
varying float keyShader;
varying float cuSSF;
varying float guSSF;
void main() {
vec3 Normal = normalize(N);
vec3 Light = normalize(L);
vec3 Eye = normalize(E);
vec3 Half = normalize(Eye + Light);
vec4 baseColor = vec4(0.5,0.5,0.5,0.0);
vec4 white = vec4(1.0,1.0,1.0,0.0);
vec4 red = vec4(1.0,0.0,0.0,0.0);
vec4 blue = vec4(0.0,0.0,1.0,0.0);
float f = 1.0;
//Locally backscattered light
float alpha = 0.43;
float mu = 1.0;
float delta = 0.35;
float muss = 0.25;
float deltass = 0.01;
float Gd;
if(meanCurvature >= 0)
 Gd = 1.0 + (alpha * exp(-1.0 * pow((meanCurvature - mu),2.0) / delta));
else
 Gd = 1.0;
//Ambient occlusion
float landa = 0.6;
float gamma = 1.0;
float Aa = 1.0 - pow((landa * meanCurvature), (2.0 * gamma));
float lDotv = dot(Light, Eye); float epsilon = 20.0;
float lv;
if(lDotv >= 0.0)
 lv = 0.0;
//Subsurface scatter
else
 float nv = exp(-1.0 * pow(dot(Normal, Eye) - muss, 2.0) / deltass);
lv = pow((-1.0 * lDotv),epsilon); float GSS = -1.0 * meanCurvature * lv * nv;
float Kd = max(dot(Normal, Light), 0.0); float Ks = pow(max(dot(Half, Normal), 0.0),
            gl_FrontMaterial.shininess);
vec4 diffuse = Kd * gl_FrontLightProduct[0].diffuse;
if(dot(Normal, Light) < 0.0) f = 0.0;
vec4 specular = f * Ks * gl_FrontLightProduct[0].specular;
vec4 ambient = gl_FrontLightProduct[0].ambient;
vec4 Css = vec4(1.0,1.0,1.0,1.0);
if(keyShader == 1.0)
      gl_FragColor = (ambient) + (Gd * dot(Normal, Light) * diffuse) - (GSS * Css);
else if(keyShader == 2.0)
      gl_FragColor = Aa * ambient;
else if(keyShader == 3.0)
      gl_FragColor = (Gd * dot(Normal, Light) * diffuse) - (GSS * Css);
else if(keyShader == 4.0)
      gl_FragColor = ambient;
else if(keyShader == 5.0)
gl_FragColor = (Aa * ambient) + (dot(Normal, Light) * diffuse)
            - (GSS * Css);
else if(keyShader == 6.0)
gl_FragColor = Gd * dot(Normal, Light) * diffuse; else if(keyShader == 7.0)
      gl_FragColor = (Aa * ambient) - (GSS * Css);
else if(keyShader == 8.0)
      gl_FragColor = diffuse;
else if(keyShader == 9.0)
gl_FragColor = (Aa * ambient) + (Gd * dot(Normal, Light) * diffuse) - (Css);
else if(keyShader == 10.0)
      gl_FragColor = GSS * baseColor;
else if(keyShader == 0.0)
gl_FragColor = (Aa * ambient) + (Gd * dot(Normal, Light) *
            diffuse) - (GSS * Css);
else if(keyShader == 11.0) {
      if(meanCurvature == 0.0)
            gl_FragColor = baseColor;
      else if(meanCurvature < 0.0)
            gl_FragColor = baseColor + ((-1.0 * meanCurvature) *
      else        blue);
            gl_FragColor = baseColor + (meanCurvature * red);
}
else if(keyShader == 12.0)
      gl_FragColor = ambient + diffuse + specular;
else if(keyShader == 13.0) {
      if(cuSSF == 0)
            gl_FragColor = baseColor;
      else if(cuSSF < 0.0)
      else  gl_FragColor = baseColor + ((-1.0 * cuSSF) * blue);
}           gl_FragColor = baseColor + (cuSSF * red);
else if(keyShader == 14.0) {
      if(guSSF == 0)
            gl_FragColor = baseColor;
      else if(guSSF < 0.0)
      else  gl_FragColor = baseColor + ((-1.0 * guSSF ) * blue);
}           gl_FragColor = baseColor + (guSSF  * red);
else if(keyShader == 15.0)
      gl_FragColor = Gd * diffuse;
else if(keyShader == 16.0)
gl_FragColor = Gd * dot(Normal, Light) * white;
else if(keyShader == 17.0)
gl_FragColor = dot(Normal, Light) * diffuse;
else if(keyShader == 18.0)
      gl_FragColor = Gd * baseColor;
else if(keyShader == 19.0)
      gl_FragColor = Aa * baseColor;
}

person damien murphy.    schedule 08.08.2014    source источник


Ответы (1)


OpenGL ES 2 не использует фиксированный конвейер функций, такой как OpenGL ES 1.0. Вам нужно будет передать данные об источнике света как униформу или атрибут.

Посмотрите пример на этой странице.

Вам также придется самостоятельно реализовать нормали и любые другие функции.

Список всех встроенных модулей, к которым у вас есть доступ в OpenGL ES 2.0, см. На странице эту справочную карточку. Вверху страницы 4 вы найдете список и описания.

person jnfjnjtj    schedule 09.08.2014
comment
Не уверен, что могу задать еще вопросы здесь, в комментарии, но какие типы gl_NormalMatrix и gl_Normal? Я предположил, что gl_NormalMatrix - это mat4, а gl_Normal - это vec4 - person damien murphy.; 11.08.2014
comment
это нормально, поэтому он имеет единичную длину 1, поэтому его vec3 и mat3 ... теперь мне нужно преобразовать фрагментный шейдер. Спасибо jnfjnjtj - person damien murphy.; 11.08.2014
comment
Извините, я не увидел этого раньше. Ознакомьтесь с моим обновленным ответом для получения дополнительной информации. - person jnfjnjtj; 12.08.2014