ios - OpenGL ES Shaders y 64-bit iPhone 5S
opengl-es 64bit (1)
CGFloat
es una variable typedef. En un entorno de compilación de 32 bits es de precisión única, en 64 bits es de doble precisión. Normalmente, esto no sería un gran problema, pero estás usando glUniform4fv
, que toma un GLfloat *
.
Especificación de OpenGL ES 2.0 - Operación GL básica - p. 12
OpenGL estipula que GLfloat
es siempre un valor de coma flotante de precisión simple y los compiladores pueden tratar la degradación de tipos desde la precisión doble hasta la precisión simple cuando utiliza la versión no apuntadora de esta función. Cuando utiliza punteros, este comportamiento no ocurre: OpenGL espera que se le pase una matriz de flotantes de precisión simple, pero le pasa una matriz de flotantes de precisión doble sin conversión de tipo.
Lo que debes hacer es dejar de usar CGFloat
. En su lugar, use GLfloat
. OpenGL typedefs se proporcionan para garantizar que este tipo de cosas nunca ocurra.
Empecé a probar con el iPhone 5S y la arquitectura de 64 bits en una aplicación OpenGL ES. El problema que estoy viendo es que los valores (CGFloat) están muy mal cuando llegan a los sombreadores. Paso en 0.8 y cambia a -1.58819e-23 cuando depuro el sombreador. Estoy usando glUniform4fv () para pasar el valor. ¿Debo usar un tipo de datos diferente o? o un método diferente para pasar los valores? El valor pasa bien cuando pruebo en 32 bits
CGFloat brushColor[4];
brushColor[0] = 0.8;
brushColor[1] = 0.1;
brushColor[2] = 0.1;
brushColor[3] = 0.3;
glUniform4fv(program[PROGRAM_POINT].uniform[UNIFORM_VERTEX_COLOR], 1, brushColor);
(algunos de ustedes pueden notar que esto es de la demo de GLPaint ...)
Gracias,
austin