当前位置: 首页 > 知识库问答 >
问题:

GLM mat4x4到布局限定符

贺高杰
2023-03-14

我目前正在学习OpenGL为一个业余项目,我达到了一点,我想做一些粒子效果与实例。

为了给我的每个粒子自己的转换,我用转换矩阵构建了一个向量,并使用缓冲区的值:

    glBindBuffer(GL_ARRAY_BUFFER, particleEffect->getTransformationBufferID());
    std::vector<glm::mat4x4> particleTransformations;
    const std::vector<Particle>& particles = particleEffect->getParticles();
    for(std::vector<Particle>::const_iterator particleIt = particles.cbegin();
        particleIt != particles.cend();
        ++ particleIt)
    {
        particleTransformations.push_back(particleIt->getTransformation());
    }
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(particleTransformations[0]) * particles.size(),  particleTransformations.data());
    glEnableVertexAttribArray(4);
    glVertexAttribPointer(4, 16, GL_FLOAT, GL_FALSE, 0, 0);

我以这种方式初始化转换缓冲区:

        glGenBuffers(1, &transformationBufferID_);
        glBindBuffer(GL_ARRAY_BUFFER, transformationBufferID_);
        glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4x4) * particles_.size(), nullptr, GL_STREAM_DRAW);

我使用这个简单的绘图代码:

    glVertexAttribDivisor(0, 0);
    glVertexAttribDivisor(1, 0);
    glVertexAttribDivisor(2, 0);
    glVertexAttribDivisor(3, 0);
    glVertexAttribDivisor(4, 1); //(4, 1), because each particle has its own transformation matrix at (layout location = 4)?!
    glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, particleEffect->getVertices().size(), particleEffect->getParticles().size());//getVertices() are the same vertices for each particle
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(3);
    glDisableVertexAttribArray(4);

我的顶点着色器标题如下所示:

    #version 430 core
    layout(location = 0) in vec3 vertexPosition;
    layout(location = 1) in vec3 normals;
    layout(location = 2) in vec4 colors;
    layout(location = 3) in vec2 uvCoordinates;
    layout(location = 4) in mat4 transformation;

这将导致glError 1281崩溃,但仅当我使用glEnableVertexAttribArray(4)时。否则这不会崩溃。当我使用一个单位矩阵而不是我的变换矩阵时,我也能够绘制我的简单粒子网格。

共有1个答案

丁慈
2023-03-14

您的问题实际上根本不是布局限定符,您需要理解顶点属性的一些细微差别。

在GPU上,每个顶点属性都是一个由4个分量组成的向量,无论您将其声明为floatvec2vec3还是vec4。这对我刚才提到的所有类型都很好,这个4分量向量中未使用的部分分别被分配为0,0,1。

然而,对于mat4,情况就大不相同了。一个mat4实际上是四个vec4的数组,这意味着mat4转换中的layout(location=4);实际上占据了4个不同的位置(都是顺序的)。

转换由分配给位置4、5、6和7的四个4分量向量组成。GLVertexattribPointer(4,16,GL_FLOAT,GL_FALSE,0,0);错误,需要将其拆分为多个调用,如下所示:

// Setup 4 different vertex attributes (one for each column of your matrix).

// Each matrix has a stride of 64-bytes and each column of the matrix advances 16-bytes
glVertexAttribPointer (4, 4, GL_FLOAT, GL_FALSE, 64, 0);
glVertexAttribPointer (5, 4, GL_FLOAT, GL_FALSE, 64, 16);
glVertexAttribPointer (6, 4, GL_FLOAT, GL_FALSE, 64, 32);
glVertexAttribPointer (7, 4, GL_FLOAT, GL_FALSE, 64, 48);

您还需要为所有四个属性位置启用、禁用和设置顶点属性除数,以使代码正确工作。

 类似资料:
  • Web设计师注定要处理很多未知的东西,如访问者使用哪一种浏览器,访问者的显示器尺寸是多少,等等。但是,设计师面临的最大问题,可能是要针对不同的显示器尺寸来创建引人入胜的设计。 针对这个问题,提出了三种基本的布局类型,分别是固定布局、流式布局和弹性布局。那到底是选择固定布局,还是流动布局,还是弹性布局?这个问题已经困扰了网页设计师们很多年了。最后的选择往往取决于需求,应该是哪种布局更适合,而不是哪种

  • 本文向大家介绍js实现瀑布流布局(无限加载),包括了js实现瀑布流布局(无限加载)的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js实现瀑布流布局的具体代码,供大家参考,具体内容如下 1.实现瀑布流布局思路 准备好数据之后 . 绑定滚动事件 . 判断页面是否到底(滚动的距离+可是区域的高度 == 最后一个元素的top) . 加载新数据,渲染新页面 .重新执行瀑布流效果 2.代码(更

  • 我正试图通过数据绑定来设置android中最小值为0、最大值为10的整数的限制。为此,我有一个可绑定的适配器,它通过两个侦听器设置一个整数的值,一个增加值,另一个减少值。最后,我想设置这个整数的极限,最小值为0,最大值为10。

  • 但是,在Log4JV2中,PatternLayout类被设置为“final”,整个体系结构也被更改。似乎不再有一种简单的方法来拦截/覆盖对PatternLayout对象的调用。我查看了Apache文档,但没有太多信息。 我检查了这个问题和这个问题,但都没有太多的帮助。 我意识到这是一个非常“一般”的问题,但是有没有人知道在Log4j V2中实现这一点的简单方法,或者对此有什么建议?

  • 有没有办法为不同的日志级别打印不同的布局?例如: 记录器。警告(“消息”);打印如下内容:2016-06-20 13:34:41245 INFO(main:)Message and for logger。信息(“消息2”);仅打印:消息2 有可能做到吗?定义一个布局以警告其他布局以获取信息 log4j.properties