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是为了确保这种事情永远不会发生。