知道为什么glVertexPointer()在使用GL_FLOAT时不会绘制任何东西吗?

时间:2009-12-15 20:58:40

标签: iphone objective-c opengl-es

使用GLfixed作为我的顶点数字类型,以下代码按预期绘制纹理:

GLfixed vertices[] = 
{
    (int)point.x,           (int)point.y + size.height,
    (int)point.x + size.width,  (int)point.y + size.height,
    (int)point.x,           (int)point.y,
    (int)point.x + size.width,  (int)point.y
};

glVertexPointer(2, GL_FIXED, 0, vertices);

我在OpenGL文档中读到GLfixed是效率最低的类型,而我应该使用GLfloat代替。但是,当我将代码切换到浮动时,没有任何东西被绘制出来。

GLfloat vertices[] = 
{
    point.x,        point.y + size.height,
    point.x + size.width,   point.y + size.height,
    point.x,        point.y,
    point.x + size.width,   point.y
};

glVertexPointer(2, GL_FLOAT, 0, vertices);

我是否需要在OpenGL状态机中设置另一个标志才能使其按预期运行?

2 个答案:

答案 0 :(得分:2)

当我查看文档时,看起来GL_FIXED是固定点16:16格式。这意味着GLfixed的16个高位代表整数部分,分数是低16位除以65536(1 << 16)。

要将其转换为浮点数,只需将数字除以65536:

const float scale = 1.0f / 65536.0f;
GLfloat vertices[] = 
{
        point.x * scale               , (point.y + size.height) * scale,
        (point.x + size.width) * scale, (point.y + size.height) * scale,
        point.x * scale               , point.y * scale,
        (point.x + size.width) * scale, point.y * scale
};

glVertexPointer(2, GL_FLOAT, 0, vertices);

如果你的顶点坐标等也是GL_FIXED格式,你也必须缩放它们。

希望这有帮助。

答案 1 :(得分:1)

修正了16:16格式。当您将值转换为'fixed'时,编译器不知道此格式是特殊的,因此它与转换为int时的格式相同。

例如,如果point.x是1,那么:

(int)point.x -> 0x00000001
(GLfixed)point.x -> 0x00000001

当OpenGL将0x00000001解释为GLfixed值时,OpenGL实际上会看到1/65536。如果您希望OpenGL读取1.0,那么正确的编码是0x00010000。

当你切换到浮动时,OpenGL实际上是一个真正的1.0。

所以,并不是你需要缩放浮点值,问题是你已经在扩展你的固定值,而你的应用程序的其余部分已经设置好来补偿它。当使用float时,现有的比例因子现在没有达到你想要的效果。

例如,通过正确转换为fixed(int&lt;&lt; 16,假设您的点存储在整数中)来让您的应用正常工作,并且您将看到相同的错误。一旦找到其他变换并修复它,那么“正确修复”和浮动应该表现相同。