我开始使用GLM库通过OpenGL 3和GLSL进行数学运算.我需要一个正交投影来绘制2D图形,所以我写了这个简单的代码:
glm::mat4 projection(1.0);
projection = glm::ortho( 0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 500.0f);
Run Code Online (Sandbox Code Playgroud)
在屏幕上打印glm :: ortho创建的值我得到:
0.00313 0.00000 0.00000 0.00000
0.00000 -0.00417 0.00000 0.00000
0.00000 0.00000 -0.00200 0.00000
-1.00000 1.00000 -1.00000 1.00000
Run Code Online (Sandbox Code Playgroud)
据我所知,这不是OpenGL中值的正确顺序,因为将此矩阵乘以位置向量将忽略所有转换值.
我用着色器和一些原语测试了那个矩阵,我只得到一个空白的屏幕.但如果我手动修改矩阵如下,它可以正常工作:
0.00313 0.00000 0.00000 -1.00000
0.00000 -0.00417 0.00000 1.00000
0.00000 0.00000 -0.00200 -1.00000
0.00000 0.00000 0.00000 1.00000
Run Code Online (Sandbox Code Playgroud)
此外,查看"glm/gtc/matrix_transform.inl"文件中的"ortho"函数:
template <typename valType>
inline detail::tmat4x4<valType> ortho(
valType const & left,
valType const & right,
valType const & bottom,
valType const & top,
valType const & zNear,
valType …Run Code Online (Sandbox Code Playgroud) 最近我更像是Scala编程语言的用户而不是C++,现在我对移植一行非常简单的代码很感到沮丧
val map = new HashMap[Vec2i,Entity]
Run Code Online (Sandbox Code Playgroud)
它只是拒绝用奇怪的模板错误在C++中编译.C++中Vec2i的等价物是glm :: ivec2,它基本上是一个带有两个整数和一些数学运算符的结构.
这是我得到了多远:
#include <iostream>
#include <unordered_map>
#include <glm/glm.hpp>
using namespace std;
using namespace glm;
struct KeyTraits {
size_t operator()(const ivec2& k) {
return std::hash<int>()(k.x) ^ std::hash<int>()(k.y);
}
bool operator()(const ivec2& a, const ivec2& b) {
return a.x == b.x && a.y == b.y;
}
};
typedef unordered_map<ivec2,int,KeyTraits,KeyTraits> MyMap;
int main(int argc, char **argv)
{
MyMap map;
map[ivec2(2,3)] = 7;
map[ivec2(3,4)] = 8;
for(auto it = map.begin(); it != map.end(); it++) {
cout …Run Code Online (Sandbox Code Playgroud) 我如何在visual studio 2012中设置GLM库?
首先,我尝试将glm librar目录解压缩到我的VS 2012项目目录(包含glm库的目录名为glm-0.9.4.4).然后我试着添加glm-0.9.4.4
PROJECT - > properties - > VC++目录 - >包含目录
然后,当我尝试#include <glm/glm.hpp>在我的代码中使用包含时,我收到以下错误:
致命错误C1083:无法打开包含文件:'glm/glm.hpp':没有这样的文件或目录
如何正确设置GLM库以在我的代码中工作?
我开始使用glm(在VS2010中)时遇到了一些非常简单的错误.我有这个简短的代码:
glm::mat4 translate = glm::translate(glm::mat4(1.f), glm::vec3(2.f, 0.f, 0.f));
glm::vec4 vector(1.f,1.f,1.f,0.f);
glm::vec4 transformedVector = translate * vector;
Run Code Online (Sandbox Code Playgroud)
transformedVector的结果与其原始值(1.f,1.f,1.f,0.f)相同.我不知道我在这里失踪了什么.我已经尝试了旋转矩阵,并且工作正常,点被正确转换.
glm::mat4 rotate = glm::rotate(glm::mat4(1.f), 90.f, glm::vec3(0.f, 0.f, 1.f));
glm::vec4 vector(1.f, 1.f, 1.f, 0.f);
glm::vec4 transformedVector = rotate * vector;
Run Code Online (Sandbox Code Playgroud)
好的,我发现了问题.我想翻译一个顶点而不是一个向量,在这种情况下我必须将w值设置为1.
我用C++ 11得到了一些奇怪的行为std::array.当我尝试std::array<std::tuple<int, float>, 6> myTuples;使用成员变量进行编译时,我收到以下错误:
mingw32\4.7.2\include\c++\array:-1: In instantiation of 'struct std::array<std::tuple<int, float>, 6u>':
mingw32\4.7.2\include\c++\array:77: error: 'std::array<_Tp, _Nm>::_M_instance' has incomplete type
我不确定是否有任何改变,但它所在的类是从另一个模板类派生的模板类.模板参数是一个unsigned int确定std::array基类中受保护的大小,我在派生类中引用它using Base<param>::m_array;.派生类有glm::vec3/dmat4/quat各种类型,并使用OpenGL固定函数glBegin(GL_QUADS);.我正在使用SDL-1.2.15来创建OpenGL上下文.我认为大部分内容都是无关紧要的,但也许不是.我可以粘贴代码,但所有内容都是互连的,所以它只能作为一个整体编译(在源之间分配大约一千行左右).
但是,当我在这个ideone示例中包含相同的行时,在非常相似的情况下,它编译完全正常.我通过命令行编译我的编译器,检查它不仅仅是我的编译器(MinGW g ++版本4.7.2)g++ -Wall -std=c++11
有谁知道为什么我会得到这些错误?在解析std::array赋值(使用array = {{a,b,c}};默认参数)时编译器崩溃之前我遇到了一些问题,但这次编译器错误没有崩溃.
我没有权限将GLM放入usr/local/include或usr/include,但我需要将GLM用于openGL.代码(我无法更改)查找GLM,如下所示:
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
Run Code Online (Sandbox Code Playgroud)
文件夹glm与我的main.cpp位于同一目录中,此代码来自此目录.我认为它不起作用,因为它在usr/include中寻找glm在构建的头文件中的位置(我使用的是redhat linux)
我怎么能阻止这种情况发生,因为我无法运行:
g++ main.cpp -lGL -lglut -lGLEW
Run Code Online (Sandbox Code Playgroud)
没有这些错误:
main.cpp:46:23: error: glm/glm.hpp: No such file or directory
main.cpp:47:40: error: glm/gtc/matrix_transform.hpp: No such file or directory
main.cpp:48:32: error: glm/gtc/type_ptr.hpp: No such file or directory
main.cpp:62: error: ‘glm’ has not been declared
main.cpp:62: error: expected constructor, destructor, or type conversion before ‘cameraMatrix’
main.cpp: In function ‘int setShaderData(const unsigned int&)’:
main.cpp:102: error: ‘glm’ has not been declared
main.cpp:102: error: expected ‘;’ before ‘projection’
main.cpp:105: error: ‘glm’ …Run Code Online (Sandbox Code Playgroud) 我想从屏幕坐标转换为世界坐标OpenGL.我正在glm为此目的使用(我也在使用glfw)
这是我的代码:
static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT) {
if(GLFW_PRESS == action){
int height = 768, width =1024;
double xpos,ypos,zpos;
glfwGetCursorPos(window, &xpos, &ypos);
glReadPixels(xpos, ypos, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zpos);
glm::mat4 m_projection = glm::perspective(glm::radians(45.0f), (float)(1024/768), 0.1f, 1000.0f);
glm::vec3 win(xpos,height - ypos, zpos);
glm::vec4 viewport(0.0f,0.0f,(float)width, (float)height);
glm::vec3 world = glm::unProject(win, mesh.getView() * mesh.getTransform(),m_projection,viewport);
std::cout << "screen " << xpos << " " << ypos << " …Run Code Online (Sandbox Code Playgroud) 我正在编写一个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,因为它是运行探查器的调试版本.
我有一个glm :: mat4矩阵,我需要将值转换为double [16]数组.关于如何解决这个问题的任何想法?
我一直在按照位于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)