OpenGL ES着色器和64位iPhone 5S

时间:2013-10-31 11:20:34

标签: ios iphone opengl-es 64-bit shader

我刚开始在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演示......)

感谢,

奥斯汀

1 个答案:

答案 0 :(得分:12)

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

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

Specification sample

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

您需要做的是停止使用CGFloat。相反,请使用GLfloat。提供OpenGL typedef以确保此类事情永远不会发生。