c – 如何使用GLM库在OpenGL中绘制顶点时使用常规坐标系

我正在尝试制作2D游戏,正在练习OpenGL和C.只是非常简单的事情.现在我已经设法使用GLM库来设置一个“相机”(带有透视,这不是我想要的),但是在尝试显示像素艺术时我遇到了一些问题我制作.

首先,有坐标系.它明显地用于3D和在“世界空间”中绘制东西,而不是用于在屏幕上绘制像素艺术.我只是想能够使用常规坐标系设置我正在绘制的每个顶点的大小和位置.这就是我参加Stack Exchange的原因.

从我能够讲述的,我应该使用正交视图,但是将我的投影矩阵设置为glm :: ortho()似乎并没有成功.事实上,什么都没有出现.我得到一个空白的屏幕.起初,我认为这是由于我的顶点仍然具有1像素大小,但即使在改变它们的位置以形成适当大小的矩形(两个三角形,技术上,但仍然)之后,屏幕上什么都没有出现.

我可能错误地使用glm :: ortho(),还是其他问题.

将投影矩阵设置为glm :: ortho().

ProjectionMatrix = glm::ortho(0, 640, 480, 0);

设置顶点.

Vertex vertices[] = {
    // Position                     // Color                        // Texcoord
    glm::vec3(0.0f, 80.0f, 0.0f),   glm::vec3(1.0f, 0.0f, 0.0f),    glm::vec2(0.0f, 1.0f),  // bottom left
    glm::vec3(0.0f, 0.0f, 0.0f),    glm::vec3(0.0f, 1.0f, 0.0f),    glm::vec2(0.0f, 0.0f),  // top left
    glm::vec3(40.0f, 0.0f, 0.0f),   glm::vec3(0.0f, 0.0f, 1.0f),    glm::vec2(1.0f, 0.0f),  // top right
    glm::vec3(40.0f, 80.0f, 0.0f),  glm::vec3(1.0f, 1.0f, 0.0f),    glm::vec2(1.0f, 1.0f)   // bottom right
};

如果需要任何进一步的代码/信息,请随时告诉我.我有点不确定要展示什么,所以我决定坚持使用显而易见的东西.

最佳答案
glm library中的功能是模板功能.参数的类型会影响操作的类型.如果将积分常量传递给函数,则内部操作是整数运算,除法的结果也是整数.

看看glm :: ortho的实现:

template<typename T>
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top)
{
    mat<4, 4, T, defaultp> Result(static_cast<T>(1));
    Result[0][0] = static_cast<T>(2) / (right - left);
    Result[1][1] = static_cast<T>(2) / (top - bottom);
    Result[2][2] = - static_cast<T>(1);
    Result[3][0] = - (right + left) / (right - left);
    Result[3][1] = - (top + bottom) / (top - bottom);
    return Result;
}

将浮点常量传递给函数,以解决您的问题:

ProjectionMatrix = glm::ortho(0.0f, 640.0f, 480.0f, 0.0f);
点赞