【问题标题】:openGL using glVertexAttribPointeropenGL 使用 glVertexAttribPointer
【发布时间】:2013-02-08 14:13:19
【问题描述】:

所以我使用 glBegin(GL_QUADS) 创建了一个四边形,然后绘制顶点,现在我想将纹理坐标数组传递给我的着色器,以便我可以将纹理应用到我的四边形。

所以我在正确使用语法时遇到了一些麻烦。

首先我制作了一个二维值数组

GLfloat coords[4][2];
coords[0][0] = 0;
coords[0][1] = 0;
coords[1][0] = 1;
coords[1][1] = 0;
coords[2][0] = 1;
coords[2][1] = 1;
coords[3][0] = 0;
coords[3][1] = 1;

然后我尝试将它放入我的着色器中,其中我有一个属性 vec2 texcoordIn

GLint texcoord = glGetAttribLocation(shader->programID(), "texcoordIn");
glEnableVertexAttribArray(texcoord);
glVertexAttribPointer(texcoord, ???, GL_FLOAT, ???, ???, coords);

所以我很困惑我应该为我标记为“???”的 glVertexAttribPointer 的参数输入什么而且我还想知道是否允许我将纹理坐标表示为二维数组,就像我最初所做的那样。

【问题讨论】:

    标签: opengl graphics textures shader fragment-shader


    【解决方案1】:

    正确的值是

    glVertexAttribPointer(
     texcoord,
     2, /* two components per element */
     GL_FLOAT,
     GL_FALSE, /* don't normalize, has no effect for floats */
     0, /* distance between elements in sizeof(char), or 0 if tightly packed */
     coords);
    

    我还想知道是否允许我像一开始那样将纹理坐标表示为二维数组。

    如果您按照上面的方式编写它,即使用静态分配的数组,那么可以,因为 C 标准断言元素将紧密地打包在内存中。但是,如果使用动态分配的指针数组,则不会。

    【讨论】:

    • 感谢您的帮助!我仍然有麻烦。看起来我的二维“坐标”数组实际上并没有做任何事情(四边形变成空白)。我很有信心我的内部着色器代码是正确的。
    • @user1782677:唯一的判断方法是,如果您发布了着色器的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多