ios - 違い - vulkan 対応端末 一覧



OpenGL ESシェーダと64ビットiPhone 5S (1)

CGFloatは可変型typedefです。 32ビットのビルド環境では単精度ですが、64ビットでは倍精度です。 通常はこれは大きな問題ではありませんが、 GLfloat *を使用するglUniform4fvを使用しています。

OpenGL ES 2.0仕様 - 基本的なGL操作 - p。 12

OpenGLはGLfloatが常に単精度浮動小数点値であることを規定しており、コンパイラはこの関数の非ポインタバージョンを使用するときに、倍精度から単精度への型降下を処理できます。 ポインタを使用すると、この動作は発生しません.OpenGLは単精度浮動小数点数の配列を渡すことを想定していますが、型変換なしで倍精度浮動小数点数の配列を渡します。

あなたがする必要があるのは、 CGFloat使用を止めることCGFloat 。 代わりに、 GLfloat使用してGLfloat 。 このようなことが起こらないように、OpenGLのtypedefが用意されています。

OpenGL ESアプリでiPhone 5Sと64ビットアーキテクチャでテストを始めました。 私が見ている問題は、(CGFloat)値がシェイダーに到達すると間違っているということです。 私はシェーダをデバッグすると0.8になり、-1.58819e-23に変わります。 私は値を渡すためにglUniform4fv()を使用しています。 別のデータ型を使用する必要がありますか? または値を渡すための別のメソッド? 私が32bitでテストすると値は上手くいく

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);

(あなたの中には、これがGLPaintのデモからわかるかもしれません...)

ありがとう、

オースティン