【问题标题】:glVertexAttribPointer, change vertex attributes layoutglVertexAttribPointer,改变顶点属性布局
【发布时间】:2013-08-09 05:29:05
【问题描述】:

我正在编写一个 glsl 1.3+ 查看器,我需要经常更改着色器的源而不是删除然后重新创建... 但是,关于重新定义顶点属性布局,opengl 的手册中没有给出一些信息。

上一次调用会发生什么

    glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0 );

何时使用另一个 posAttrib 调用它? 如何从顶点属性数组中“取消绑定”着色器输入变量? 如何使相同的 posAttrib 指向顶点属性数组中的不同位置?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    要回答您关于上次调用 glVertexAttribPointer 会发生什么的问题,我相信属性指针刚刚被 glVertexAttribPointer 的最新调用重新分配。

    在这种用法中没有“解除绑定”。您只是更改了引用,没有创建额外的内存。最后一个输入参数是您提供的posAttrib 作为 VBO 的偏移量。如果您的posAttrib 包含顶点坐标、法线和纹理坐标,那么您可以执行以下操作,假设您定义了一个新类型AttributedVertex,其中包含 8 个floats(3 代表顶点,3 代表法线,2 代表纹理坐标)

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(AttributedVertex), 0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(AttributedVertex), (void *)(3*sizeof(GLfloat));
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(AttributedVertex), (void *)(6*sizeof(GLfloat));
    

    你的顶点着色器应该有 3 个属性,比如

    attribute vec3 inPosition;
    attribute vec3 inNormal;
    attribute vec2 inTexCoord;
    

    对应那些顶点属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      相关资源
      最近更新 更多