Проблемы с использованием значения атрибута вершины в opengles 2.0

Я борюсь в течение нескольких дней, и я до сих пор не могу понять, что я делаю неправильно. У меня есть атрибут вершины, состоящий из одного числа с плавающей запятой, и я хочу сравнить его значение с другим в операторе if, но я всегда получаю истинное утверждение, даже если это не так; Вот мой вершинный шейдер, в котором возникла проблема:

attribute vec4 a_Position;
attribute vec3 a_Normal;
attribute vec2 a_TextureCoord; 
attribute highp float a_Bone;
uniform mat4 bone_1; 
uniform mat4 bone_0; 
varying vec2 v_TextureCoord; 
void main() { 
  v_TextureCoord = a_TextureCoord; 
  vec4 posy;
  float a = a_Bone;
  if(20.0<a) 
     posy = bone_0*a_Position;
  else 
     posy = bone_1*a_Position;
  gl_Position = posy; 
  } 

если я заменю то, что находится в операторе if, на "true" или "false", все будет работать, как и ожидалось... но если я попытаюсь использовать это значение атрибута для сравнения, оператор if действует как оператор, всегда истинный, даже если когда значение a_Bone равно 1,0 или 2,0 (явно меньше 20,0)


person Madalin    schedule 27.09.2016    source источник
comment
Не могли бы вы предоставить больше информации, например, как вы передаете коды юниформ-переменных и атрибутов вершин?   -  person Tokenyet    schedule 27.09.2016
comment
да ... все атрибуты вершин хранятся в vbo..   -  person Madalin    schedule 27.09.2016
comment
GLES20.glEnableVertexAttribArray(a_bone); GLES20.glVertexAttribPointer(a_bone,1, GLES20.GL_FLOAT, ложь, шаг, (position_count +normal_count+texCoord_count)*bytes_per_float); таким образом я делаю передачу данных   -  person Madalin    schedule 27.09.2016
comment
Проблема не в передаче данных, потому что они успешно отображаются, когда я удаляю оператор if, и я также пытался заменить a_Bone из оператора if на a_Position.x и те же результаты.   -  person Madalin    schedule 27.09.2016


Ответы (1)


Мы использовали Attributes в операторах if, и код отлично работает на большинстве устройств OpenGL ES 2.0. Так что это не проблема в использовании атрибутов. Вот рабочий код того, как мы это сделали.

int jointId = int(optionalData1.x);
if(jointId > 0)
    finalMatrix = jointTransforms[jointId - 1] * optionalData2.x;

Этот код отлично работает на всех устройствах iOS и Android. optionalData1 — это атрибут, и мы даже используем это значение, чтобы получить матрицу из универсального массива для матрицы преобразования костей.

person codetiger    schedule 28.09.2016
comment
Спасибо за ответ, но я пробовал это безуспешно ... Я также тестировал на нескольких устройствах (Samsung, Htc) и на нескольких версиях Android 4.4, 5.1, 6.0 ... без успеха - person Madalin; 28.09.2016