使用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状态机中设置另一个标志才能使其按预期运行?
答案 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,假设您的点存储在整数中)来让您的应用正常工作,并且您将看到相同的错误。一旦找到其他变换并修复它,那么“正确修复”和浮动应该表现相同。