2009-12-15 78 views
0

使用GLfixed我的顶点号键入下面的代码绘制贴图预期:任何想法为什么glVertexPointer()在使用GL_FLOAT时不会绘制任何东西?

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状态机中设置,以使其表现符合预期?

+0

@Shaun,我在我的答案中修复了一个小错误。 – 2009-12-15 21:34:46

+0

在完全放弃浮点的定点值之前,应该考虑将几何转换为使用GLshort。由于尺寸缩小,它们可能比GLfloats或GLfixeds更有效。在iPhone上调整OpenGL性能时,最小化几何体的大小至关重要。 – 2009-12-16 03:02:45

回答

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格式。

希望这会有所帮助。

+0

这是否说'GLfloat'与'float'(用于计算这些顶点的CGPoint和CGSize的默认类型)不兼容? – 2009-12-15 21:35:42

+1

@Shaun不,完全没有。但是,如果'point'中的值是float,这意味着它们已经被65536缩放以正确使用'GLfixed'。 – 2009-12-15 21:38:01

+0

谢谢安德烈亚斯。这完全有效,但我仍然不明白为什么它是必要的。我在网上或iPhone开发书中遇到的示例OpenGL代码都不需要使用“浮动”来缩放。 – 2009-12-15 21:44:13

1

固定为16:16格式。当你将一个值转换为'fixed'时,编译器不知道这个格式是特殊的,所以它与你转换为int时相同。

例如,如果point.x是一个,那么:

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

当OpenGL的解释00000001作为GLfixed值,OpenGL的实际看到1/65536。如果你想OpenGL读取1.0,那么正确的编码是0x00010000。

当你切换到浮动状态时,OpenGL实际上变成了一个真正的1.0。

所以,这并不是说你需要调整浮点值,问题是你已经调整了你的固定值,并且你的应用程序的其余部分已经被设置来补偿这个值。当使用float时,现有的比例因子现在没有做你想要的。

例如,通过适当转换为固定值(假设您的积分存储在整数中),您将看到相同的错误。一旦你找到其他转换并修复它,那么'正确固定'和浮动应该表现相同。

+0

谢谢Frogblast。你的回答引发了安德烈亚斯所说的焦点。 – 2009-12-16 17:59:08

相关问题