OpenGL ES着色器和64位iPhone 5S

7
我刚开始在iPhone 5S上测试基于OpenGL ES的应用和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个回答

12

CGFloat 是一个变量类型定义。在32位编译环境中,它是单精度,在64位中是双精度。通常这不是什么大问题,但你正在使用 glUniform4fv,它需要一个GLfloat *

                     OpenGL ES 2.0规范 - 基本GL操作 - 第12页

              规范示例

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

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


2
如果您看到苹果的示例代码使用 CGFloat 而应该使用 GLfloat,请提交错误报告 - rickster
它帮助了我!谢谢!=) - Nubaslon
我花了大约6个小时来更改我的整个应用程序的OpenGL ES代码并找出问题所在。最终发现这就是原因。 - hariszaman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接