小编den*_*niz的帖子

旋转3D空间中的矢量

我在opengl中制作了一个android项目,它使用加速计来计算特定轴的变化,我的目标是旋转我的类似航天器的物体的运动矢量.问题是我无法理解旋转矩阵背后的数学.默认运动矢量为0,1,0,表示+ y,因此对象在开头向上看.而我正在尝试旋转它的运动矢量,这样我就可以移动它所指向的物体.我可以在手机中收集旋转变化.x轴:旋转[0],y轴:旋转[1],z轴:旋转[2].如何使用旋转矩阵旋转运动矢量?

math 3d vector rotation linear-algebra

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

我为什么要使用非阻塞或阻塞套接字?

首先,我必须问哪个国家哪个最好?例如,实时MMORPG服务器.如果我为每个客户端创建一个线程而不是使用非阻塞套接字怎么办?或者如果我使用一个包含所有非阻塞套接字的线程怎么办?你能解释一下这些优点吗?

c++ sockets winsock

38
推荐指数
2
解决办法
3万
查看次数

哪些编译器支持std :: filesystem?

感谢C++ 11,在与boost的长期关系之后,让我依赖它的最后一个组件是文件系统.根据链接:文件系统库, std :: filesystem似乎是实验性的

由于它模仿boost :: filesystem,我可以轻松地将我的项目调整为std并摆脱巨大的boost依赖.哪些编译器支持它并且使用它是否重要,即使它是实验性的,因为它模仿提升(因为它没有时间表来标准化)?

c++ boost boost-filesystem c++17

9
推荐指数
1
解决办法
4948
查看次数

OpenGL GLSL Cel Shading和Outline算法

我已经使用glsl成功实现了一个cel着色器.但我的问题是关于概述所有内容,互联网上每个opengl的例子都很旧,与现有技术不匹配,所以技术速度慢......所以我无论如何都无法在glsl中找到它.我想到了一些想法,比如将最不密集的区域着色为黑色,但是对于gl_Vertex,gl_Position和眼睛位置甚至没有足够的解释.所以,由于每种技术都太老了,我终于决定向某人询问这个大纲问题.

opengl glsl outline

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

OpenGL:骨骼动画,为什么在使用GPU时我需要反向绑定姿势?

我实现了一个带有软件皮肤的MD5 Loader.md5中的绑定姿势是最终的,绝对位置和旋转,你只需要对关节相关的权重进行计算.

我试图实现GPU皮肤,但我陷入了困境.由于这些坐标是最终的,为什么我不能将我的3d矢量和四元数转换为矩阵并将其上传到着色器?正如我在这里读到的:http://3dgep.com/?p = 1356,我需要将我的骨架与绑定姿势的倒数相乘.但我不明白这一部分,因为我一直认为我唯一需要做的就是将最终矩阵上传到GPU并计算其余部分(权重总和等等)

你能解释一下逆绑定姿势的行为吗?

opengl glsl skeletal-mesh

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

动态打包OpenGL顶点缓冲区对象的数据

我试图在OOP中为VBO编写一个包装器,它包含addVertex,addNormal .. addX,flush()和render()函数.首先,我在不同的向量中保存顶点,法线,索引,如:

std::vector<glm::vec4> vertexBuffer;
std::vector<glm::vec4> colorBuffer;
std::vector<glm::vec3> normalBuffer;
std::vector<glm::vec2> texCoordBuffer;
std::vector<unsigned int> indexBuffer;
Run Code Online (Sandbox Code Playgroud)

但是当我在某处读到时,为每个人保存不同的VBO ID是完全没有效率的,因此最好按照VertexNormalTexCoordColor - VNTC - VNTC ...的顺序打包它们,并将它们表示在一个VBO ID中.因此,上传到GPU时可以有效地使用缓冲区.所以这次我仍然将它们保存在向量中但是当我调用flush()时我想用结构包装它们,然后将该结构向量上传到GPU:

struct VBOData {
    glm::vec4 vert;
    glm::vec3 normal;
    glm::vec4 color;
    glm::vec2 texcoord;
};
std::vector<VBOData> vboBuffer;
Run Code Online (Sandbox Code Playgroud)

然后我上传flush()中的所有内容:

vboBuffer.reserve(vertexBuffer.size());

for (int i = 0; i < vertexBuffer.size(); ++i) {
    VBOData data;
    data.vert = vertexBuffer[i];
    data.color = colorBuffer[i];
    data.normal = normalBuffer[i];
    data.texcoord = texCoordBuffer[i];
    vboBuffer.push_back(data);
}

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vboBuffer.size() * sizeof(VBOData), (GLchar*) &vboBuffer[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

现在有这个问题,如果我的对象不包含颜色,法线或tex坐标并且只包含顶点怎么办?或者只关于顶点和法线?或者总是有顶点的不同数据组合?为了提高效率,我能否以V(N)(T)(C)顺序动态打包它们?

c++ opengl vbo

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

GLM可以用作glUniformx()中的普通旧数据吗?

由于设计薄弱,我不得不重写我的整数数学库和与数学相关的事情.相反,我发现我可以使用GLM.如果你遇到我之前的问题,我一直在处理骨骼动画,所以我必须上传大量的mat4s,vec3,vec2s.这是我之前的顶点结构:

struct Vertex {
    Vec3 pos;
    Vec3 normal;
    Vec2 uv;
    Vec4 boneindex;
    Vec4 weightbias;
};
Run Code Online (Sandbox Code Playgroud)

不幸的是我发现我的数学库不是POD,我试图上传整个结构,我确实得到了奇怪的结果.我的最终骨骼矩阵定义为:

Mat4 bones[numBones];
Run Code Online (Sandbox Code Playgroud)

我也尝试立即上传.

我只是想知道如果我用glm :: vec3,vec2,mat4替换我的Vec3s,Vec2s和Mat4s并直接上传整个Vertex结构(顶点次数)并使用以下方法为每个数据设置偏移量:

 glBindBuffer(GL_ARRAY_BUFFER,everythingVBO);
 glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(0)) // pos
 glVertexAttribPointer(xx,xx,xx,xx, BUFFER_OFFSET(sizeof(glm::vec3)) // norm
 ..
 ..

 same for matrix
 glUniformMatrix4fv(xx, numBones, xx, glm::mat4 value)
Run Code Online (Sandbox Code Playgroud)

.

它会按预期工作吗?我只是不想重写整件事,这次我必须确保它有效,因为我不想再次面对另一个失败.

c++ opengl glsl pod

5
推荐指数
1
解决办法
943
查看次数

OpenGL中Skeletal Animation背后的逻辑

骨骼重量,骨骼影响,关节,偏移和局部矩阵用于什么?互联网上没有一篇文章可以很好地解释逻辑.我仍然不知道每个骨骼是否有一个不同的模型,后来与其他模型相结合.或者如何处理这些矩阵,如何设置骨骼,组合和修饰它们......如果你能在opengl中分享任何关于骨骼动画的文章或知识,我将很高兴.

animation

4
推荐指数
1
解决办法
2080
查看次数

上传到着色器时为什么需要将四元数转换为4x4矩阵?

我已经阅读了几个关于OpenGL骨架动画的教程,它们似乎都是单一的使用四元数进行旋转,3d矢量进行翻译,所以不是矩阵.

但是当它们进入顶点蒙皮过程时,它们将所有四元数和三维矢量组合成一个4x4矩阵,并上传矩阵以在着色器中执行其余的计算.4x4矩阵有16个元素,而四元数+ 3d向量只有7个.那么为什么我们要在上传之前将它们转换为4x4矩阵?

opengl glsl matrix skeletal-mesh

4
推荐指数
2
解决办法
4570
查看次数

性能比较:strstr()vs std :: string :: find()

有人可以解释为什么我应该使用strstr或字符串find()?哪一个更快,在哪里?

c c++ string

3
推荐指数
2
解决办法
5712
查看次数

提示使用自定义目录查找<name> .cmake文件

在CMake中,有没有办法制作内置的Find脚本来确定我们指定的自定义目录的优先级?因为特别是在Windows中,模块查找脚本通常无法检测模块,例如visual studio目录.因此,我通常必须手动设置外部库的路径,这是非常累人的.相反,我希望这些脚本能够查看自定义目录,首先让我们在主项目中说"dependencies"文件夹,以便我可以直接将这些外部文件放在该文件夹中,这比将它们放入VC文件夹或手动设置更容易.路径.

cmake

3
推荐指数
1
解决办法
3202
查看次数

2d数组是否适用于glUniformMatrix4fv,C++?

我有一个4x4矩阵类,它将值保存为2d float array:float mat [4] [4]; 我重载了[]运算符

inline float *Matrix4::operator[](int row) { return mat[row]; }

我的着色器中有一个统一的mat4(统一的mat4 Bones [64];),我将上传我的数据.我将骨骼保存为Matrix4指针(Matrix4*finalBones),这是一个包含numJoints元素的矩阵数组.这就是我用来上传数据的方法:

glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalBones[0][0]);
Run Code Online (Sandbox Code Playgroud)

我完全不确定将要发生什么,所以我需要问,如果这将起作用或我需要将所有内容提取到16*numJoints大小的浮点数组中,这对于每个tick来说似乎都很昂贵.

编辑这就是我所做的,每次绘制操作看起来都很贵

void MD5Loader::uploadToGPU()
{
float* finalmat=new float[16*numJoints];
for (int i=0; i < numJoints; i++)
    for (int j=0; j < 4; j++)
        for(int k=0; k < 4; k++)
            finalmat[16*i + j*4 + k] = finalBones[i][j][k];


glUniformMatrix4fv(shader.getLocation("Bones"),numJoints,false,finalmat);

delete[] finalmat;
}
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl

2
推荐指数
1
解决办法
1668
查看次数

glBufferData 崩溃

我在 glBufferData 有随机崩溃,它只发生在 Windows 上。Mac OS 和 Linux 没有问题。那是我的上传功能,它将我保存在内存中的所有内容上传到 GPU。vertex是一个浮点向量数组,它是:

std::vector<float> vertex[MAX_VBO];
Run Code Online (Sandbox Code Playgroud)

并且代码在第一个 glBufferData 函数处随机崩溃,我调用它是随机的,因为它有时可以工作,但是当我的顶点数据很大时,它几乎肯定会崩溃。

void VertexBuffer::upload() {
    glGenBuffers(5, vbo);

    printf("VBO %d - %d - %d\n", vertex[vboPosition].size(), vertex[vboNormal].size(), indices.size());
    if (vertex[vboPosition].size() > 0) {
        glBindBuffer(GL_ARRAY_BUFFER, vbo[vboPosition]);
        glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float)*4, &vertex[vboPosition][0], GL_STATIC_DRAW);
    }


    if (vertex[vboNormal].size() > 0) {
        glBindBuffer(GL_ARRAY_BUFFER, vbo[vboNormal]);
        glBufferData(GL_ARRAY_BUFFER, vertex[vboNormal].size() * sizeof(float)*3, &vertex[vboNormal][0], GL_STATIC_DRAW);
    }


    if (vertex[vboColor].size() > 0) {
        glBindBuffer(GL_ARRAY_BUFFER, vbo[vboColor]);
        glBufferData(GL_ARRAY_BUFFER, vertex[vboColor].size() * sizeof(float)*4, &vertex[vboColor][0], GL_STATIC_DRAW);
    }


    if (vertex[vboUV].size() > 0) {
        glBindBuffer(GL_ARRAY_BUFFER, vbo[vboUV]); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl

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