标签: glm-math

加速变换计算

我正在编写一个OpenGL3 2D引擎.目前,我正在努力解决瓶颈问题.因此,AMD Profiler的以下输出:http: //h7.abload.de/img/profilerausa.png

数据是使用数千个精灵制作的.

然而,在50,000个精灵上,testapp已经无法以5 fps的速度使用.

这表明,我的瓶颈是我使用的转换功能.这是相应的功能:http: //code.google.com/p/nightlight2d/source/browse/NightLightDLL/NLBoundingBox.cpp#130

void NLBoundingBox::applyTransform(NLVertexData* vertices) 
{
    if ( needsTransform() )
    {
            // Apply Matrix
            for ( int i=0; i<6; i++ )
            {
                glm::vec4 transformed = m_rotation * m_translation * glm::vec4(vertices[i].x, vertices[i].y, 0, 1.0f);
                vertices[i].x = transformed.x;
                vertices[i].y = transformed.y;
            }
            m_translation = glm::mat4(1);
            m_rotation    = glm::mat4(1);
            m_needsTransform = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法在着色器中执行此操作,因为我正在同时批处理所有精灵.这意味着,我必须使用CPU来计算变换.

我的问题是:解决这个瓶颈的最佳方法是什么?

我不使用任何线程atm,所以当我使用vsync时,我也会获得额外的性能,因为它等待屏幕完成.这告诉我应该使用线程.

另一种方法是使用OpenCL吗?我想避免使用CUDA,因为据我所知它只能在NVIDIA显卡上运行.是对的吗?

后脚本:

如果您愿意,可以在此处下载演示:

http://www63.zippyshare.com/v/45025690/file.html

请注意,这需要安装VC++ 2008,因为它是运行探查器的调试版本.

c++ opengl opencl glm-math

7
推荐指数
1
解决办法
1359
查看次数

GLM:如何转置矢量?

也许我只是遗漏了文档中的内容,但似乎GLM不可能采用向量的转置.我也看不到mat3x1或mat1x3类型.glm :: transpose也不适用于矢量.我错过了什么或者这只是GLM缺乏的功能吗?

c++ vector glm-math

7
推荐指数
2
解决办法
9875
查看次数

如何正确旋转GLM四元数?

我希望在我的游戏中将我的汽车向左旋转90度.

当我使用这段代码时:

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(glm::rotate(rot,glm::eulerAngles(rot)+glm::vec3(90.0f,0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)

汽车得到一个奇怪的旋转.

但是,以下代码根本不会改变汽车的旋转(正如我所期望的那样,只是为了确保GLM与游戏中的quats兼容):

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(rot);
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)

每当我尝试检查旋转是否随之改变时:

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(glm::rotate(rot,vec3(0.0,0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)

汽车轮换仅设置为游戏中的0,0,0,0轮换.我希望这个代码保持旋转不受影响,因为我期望以下代码将汽车向左旋转90度:

            glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(glm::rotate(rot,vec3(90.0,0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;
Run Code Online (Sandbox Code Playgroud)

但这不符合我的要求.它只是设置旋转,而不是将其添加到'rot'.

我究竟做错了什么?

c++ transformation rotation quaternions glm-math

7
推荐指数
1
解决办法
1万
查看次数

如何告诉CMAKE下载一些必要的头文件(更准确地说是GLM数学库)而不试图编译它们?

我正在建立一个使用大量ExternalProjects的CMAKE项目.要构建其中一个(CEGUI),我需要下载GLM(OpenGL数学库).此库仅包含库,这意味着您不能编译它.有一些测试可以编译,但在我的项目中不需要它们(而且,其中一个不能正确编译并打破编译链).

我想要的是找到一种方法告诉CMAKE只下载项目(GIT更新等),就像它通常使用ExternalProject_add()函数一样,但不试图编译它(产生一个致命错误),并安装INCLUDE文件(确实是库).

是否有下载头文件并在CMAKE中安装它们的功能?有没有人已经有GLM标题库这个问题?

c++ opengl download cmake glm-math

7
推荐指数
1
解决办法
3563
查看次数

第四排VP Matrix

如果有关于矩阵乘法的问题.存储在View Projection Matrix第四行的信息是什么?我认为旋转和缩放信息存储在上面的3x3矩阵中,然后在第四列中进行转换,最后一个元素设置为1.我很难,因为我得到了我的VP矩阵的以下结果:

当不应用旋转且不进行平移时(注意所有值都被舍入):

0.34 0 0 0
0 0.61 0 0
0 0 -1 -0.2
0 0 -1 0
Run Code Online (Sandbox Code Playgroud)

应用-100的翻译:

0.34 0 0 0
0 0.61 0 -61.73
0 0 -1 -0.2
0 0 -1 0
Run Code Online (Sandbox Code Playgroud)

平移-100,然后在正X轴上旋转30°,然后在正Y轴上旋转180°:

-0.34 0 -3 0
0 0.53 0.3 -53.46
0 -0.5 0.86 49.8
0 -0.5 0.8 50
Run Code Online (Sandbox Code Playgroud)

它看起来不对我.有趣的部分:它有效.那么这条线的信息是什么?

0 -0.5 0.8 50
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

c++ matrix-multiplication glm-math

7
推荐指数
1
解决办法
139
查看次数

如何在c ++/opengl中使用glm常量

我只用OpenGL编程并使用GLM(OpenGL数学).我发现GLM中有一个名为"GLM_GTC_constants"的扩展,它应该提供一个内置常量列表.这是函数头的外观constants.hpp:

/// Return the pi constant.
/// @see gtc_constants
template <typename genType>
GLM_FUNC_DECL GLM_CONSTEXPR genType pi();
Run Code Online (Sandbox Code Playgroud)

函数本身看起来像this(constants.inl):

template <typename genType>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR genType pi()
{
    return genType(3.14159265358979323846264338327950288);
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何使用这个功能.


glm::pi();
Run Code Online (Sandbox Code Playgroud)

使用上述功能不起作用.

float PI = glm::pi();
Run Code Online (Sandbox Code Playgroud)

例如,上面的代码给了我这个错误:

error: no matching function for call to ‘pi()’
Run Code Online (Sandbox Code Playgroud)

我搜索了文档但没有在任何地方找到这些常量的用法示例.

c++ opengl glm-math

7
推荐指数
1
解决办法
4309
查看次数

基于四元数的第一人称视角相机

我一直在按照位于https://paroj.github.io/gltut/的教程学习 OpenGL 。

通过基础知识后,我在理解四元数及其与空间方向和变换的关系方面遇到了一些困难,特别是从世界空间到相机空间,反之亦然。在“相机相对方向”一章中,作者制作了一个相机,它在世界空间中相对于相机方向旋转模型。引用:

我们想要应用方向偏移 (R),它在相机空间中获取点。如果我们想将其应用于相机矩阵,只需将其乘以相机矩阵:R * C * O * p。这很好,但我们想要将变换应​​用于 O,而不是 C。

我未经教育的猜测是,如果我们将偏移应用于相机空间,我们将获得第一人称相机。它是否正确?相反,偏移会应用于世界空间中的模型,使飞船相对于该空间而不是相机空间旋转。我们只是从相机空间观察它旋转。

至少受到对四元数的一些理解的启发(或者我是这么认为的),我尝试实现第一人称相机。它有两个属性:

struct Camera{ 
  glm::vec3 position; // Position in world space.
  glm::quat orientation; // Orientation in world space.
}
Run Code Online (Sandbox Code Playgroud)

位置会根据键盘操作进行修改,而方向会因鼠标在屏幕上的移动而发生变化。

注意:GLM 重载了*运算符 forglm::quat * glm::vec3和通过四元数旋转向量的关系( 的更紧凑形式v' = qvq^-1

例如,向前移动和向右移动:

glm::vec3 worldOffset;
float scaleFactor = 0.5f;
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
    worldOffset = orientation * (axis_vectors[AxisVector::AXIS_Z_NEG]); // AXIS_Z_NEG = glm::vec3(0, 0, -1) …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glm-math

7
推荐指数
1
解决办法
7232
查看次数

如何在 glm 中创建广告牌矩阵

如何使用 glm 从空间中的一点创建广告牌翻译矩阵?

opengl glsl glm-math

6
推荐指数
2
解决办法
2719
查看次数

将 mat3 转换为 mat4 的最简单方法

我提取了 mat4 的左上角 3x3 旋转矩阵:

glm::mat4 model;  
glm::mat3 rot = glm::mat3(model);
Run Code Online (Sandbox Code Playgroud)

现在我想要单位矩阵,左上角是我的新 mat3

在此输入图像描述

最简单的方法是什么?

glm::mat4 result;
result[0] = glm::vec4(rot[0], 0);
result[1] = glm::vec4(rot[1], 0);
result[2] = glm::vec4(rot[2], 0);
result[3] = glm::vec4(0, 0, 0, 1);
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

matrix glm-math

6
推荐指数
1
解决办法
8658
查看次数

GLM 如何处理翻译

OpenGL 数学库 (GLM) 使用以下算法来计算平移矩阵:

//taken from source code
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)
{
    mat<4, 4, T, Q> Result(m);
    Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
    return Result;
}
Run Code Online (Sandbox Code Playgroud)

(这里向量v是 3 维向量,矩阵 m 是 4X4 矩阵,因为我们使用齐次坐标,向量v也是 4 维)。

以下来自线性代数理论:

m具有条目:

在此输入图像描述

现在,假设矩阵m给出了一些线性变换,并且也是一个变换矩阵,如果我没记错的话,我们想分别在 X、Y 和 Z 维度上添加 X、Y 和 Z 的平移,我们这样做的方法是形成一个复合矩阵: …

c++ opengl glsl matrix glm-math

6
推荐指数
1
解决办法
1万
查看次数