7

我刚开始在 OpenGL ES 应用程序上使用 iPhone 5S 和 64 位架构进行测试。我看到的问题是(CGFloat)值在到达着色器时是错误的。我传入 0.8 并在调试着色器时更改为 -1.58819e-23。我正在使用 glUniform4fv() 来传递值。我需要使用不同的数据类型吗?或不同的方法来传递值?当我在 32 位上测试时,这个值很好

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

谢谢,

奥斯汀

4

1 回答 1

12

CGFloat是一个变量 typedef。在 32 位构建环境上它是单精度的,在 64 位上它是双精度的。通常这不会是一个大问题,但您使用glUniform4fv的是GLfloat *.

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

              规格样本

OpenGL 规定GLfloat始终是单精度浮点值,当您使用该函数的非指针版本时,编译器可以处理从双精度到单精度的类型降级。当您使用指针时,不会发生这种行为 - OpenGL 期望传递一个单精度浮点数组,但您传递给它的是一个不进行类型转换的双精度浮点数组。

您需要做的是停止使用CGFloat. 相反,使用GLfloat. 提供了 OpenGL 类型定义以确保这种事情永远不会发生。

于 2013-10-31T16:52:35.913 回答