OpenGL ES着色器和64位iPhone 5S

我刚刚开始在OpenGL ES应用程序上testingiPhone 5S和64位体系结构。 我看到的问题是(CGFloat)值到达着色器时是错误的。 当我debugging着色器时,我传入0.8,并更改为-1.58819e-23。 我正在使用glUniform4fv()传入值。 我需要使用不同的数据types还是? 或不同的方法来传递值? 当我在32bit上testing的时候,这个值很好

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演示…)

谢谢,

奥斯汀

CGFloat是一个variablestypedef。 在32位构build环境中,它是单精度的,在64位上是双精度的。 通常这不是一个大问题,但是你使用的glUniform4fv ,它需要一个GLfloat *

OpenGL ES 2.0规范 – 基本GL操作 – p。 12

规格样本

OpenGL规定GLfloat总是一个单精度浮点值,当你使用这个函数的非指针版本时,编译器可以处理从双精度到单精度的types降级。 当你使用指针时,这种行为不会发生 – OpenGL希望传递一个单精度浮点数组,但是你传递一个双精度浮点数组而不进行types转换。

你需要做的是停止使用CGFloat 。 相反,使用GLfloat 。 提供OpenGL typedefs是为了确保这种事情永远不会发生。