• <small id='MytlL'></small><noframes id='MytlL'>

        <bdo id='MytlL'></bdo><ul id='MytlL'></ul>
    1. <i id='MytlL'><tr id='MytlL'><dt id='MytlL'><q id='MytlL'><span id='MytlL'><b id='MytlL'><form id='MytlL'><ins id='MytlL'></ins><ul id='MytlL'></ul><sub id='MytlL'></sub></form><legend id='MytlL'></legend><bdo id='MytlL'><pre id='MytlL'><center id='MytlL'></center></pre></bdo></b><th id='MytlL'></th></span></q></dt></tr></i><div id='MytlL'><tfoot id='MytlL'></tfoot><dl id='MytlL'><fieldset id='MytlL'></fieldset></dl></div>
        <tfoot id='MytlL'></tfoot><legend id='MytlL'><style id='MytlL'><dir id='MytlL'><q id='MytlL'></q></dir></style></legend>

        检索现有着色器属性时,glGetAttribLocation 返回 -

        时间:2023-09-17

        1. <tfoot id='AGZuw'></tfoot>

              <tbody id='AGZuw'></tbody>
          • <small id='AGZuw'></small><noframes id='AGZuw'>

            <legend id='AGZuw'><style id='AGZuw'><dir id='AGZuw'><q id='AGZuw'></q></dir></style></legend>
            • <bdo id='AGZuw'></bdo><ul id='AGZuw'></ul>
                <i id='AGZuw'><tr id='AGZuw'><dt id='AGZuw'><q id='AGZuw'><span id='AGZuw'><b id='AGZuw'><form id='AGZuw'><ins id='AGZuw'></ins><ul id='AGZuw'></ul><sub id='AGZuw'></sub></form><legend id='AGZuw'></legend><bdo id='AGZuw'><pre id='AGZuw'><center id='AGZuw'></center></pre></bdo></b><th id='AGZuw'></th></span></q></dt></tr></i><div id='AGZuw'><tfoot id='AGZuw'></tfoot><dl id='AGZuw'><fieldset id='AGZuw'></fieldset></dl></div>

                  本文介绍了检索现有着色器属性时,glGetAttribLocation 返回 -1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我正在尝试将属性传递给我的顶点着色器,但由于某种原因,它一直在第三个属性位置给我一个 -1,我要求 openGl 通过 glGetAttribLocation() 进行检索.目前它一直给我一个 -1 的 texCoord 属性,如果我切换 texAttrib 和 colAttrib(切换代码中的行),它会给我一个 -1 的颜色属性而不是纹理,我不知道为什么?由于 -1 被传递给 glVertexAttribPointer,我得到了 1281 OpenGL 错误:GL_INVALID_VALUE.

                  I'm trying to pass in attributes to my vertex shader but for some reason it keeps giving me a -1 on the 3rd attribute location I'm asking openGl to retrieve via glGetAttribLocation(). Currently it keeps giving me a -1 for the texCoord attribute and if I switch the texAttrib and colAttrib around (switching the lines in code) it gives me a -1 on the color property instead of the texture and I have no idea why? Since a -1 is being passed to glVertexAttribPointer I get the 1281 OpenGL error: GL_INVALID_VALUE.

                  我的顶点着色器:

                  #version 150
                  
                  in vec3 position;
                  in vec3 color;
                  in vec2 texcoord;
                  
                  out vec3 Color;
                  out vec2 Texcoord;
                  
                  void main()
                  {
                      Color = color;
                      Texcoord = texcoord;
                      gl_Position = vec4(position.x, position.y, position.z, 1.0);
                  }
                  

                  OpenGL 代码:

                  basicShader.Use();
                  
                  // Buffers and shaders
                  glGenVertexArrays(1, &vao);
                  glBindVertexArray(vao);
                  
                  glGenBuffers(1, &vbo);
                  // Make it active vbo
                  glBindBuffer(GL_ARRAY_BUFFER, vbo);
                  
                  // Build basic triangle
                  float vertices[] = {
                      // position         // color          // textures
                      -0.5f,  0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
                       0.5f,  0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right
                       0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
                      -0.5f, -0.5f, 0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f// Bottom-left
                  };
                  GLuint elements[] = {
                      0, 1, 2,
                      2, 3, 0
                  };
                  
                  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
                  
                  GLint posAttrib = glGetAttribLocation(basicShader.shaderProgram, "position");
                  glEnableVertexAttribArray(posAttrib); // Enable attribute first before specifiying attributes
                  glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0); // 6 float sizes is every new vertex
                  
                  GLint colAttrib = glGetAttribLocation(basicShader.shaderProgram, "color");
                  glEnableVertexAttribArray(colAttrib);
                  glVertexAttribPointer(colAttrib, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); // same for color + offset
                  
                  GLint texAttrib = glGetAttribLocation(basicShader.shaderProgram, "texcoord"); // Returns -1
                  glEnableVertexAttribArray(texAttrib);
                  glVertexAttribPointer(texAttrib, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); // 6 offset from beginning
                  
                  [..]
                  

                  推荐答案

                  你应该停止使用 glGetAttribLocation.为每个属性分配一个位置,或者在glBindAttribLocation之前链接程序或使用明确的属性位置(如果您可以使用).

                  You should stop using glGetAttribLocation. Assign each attribute a location, either with glBindAttribLocation before linking the program or with explicit attribute locations, if that's available to you.

                  那样,如果编译器优化了一个属性(这就是这里发生的事情;您的片段着色器可能不使用内插值之一),您就不会在意.您将像往常一样使用属性索引的标准约定来设置数组.另外,每次要使用不同的程序进行渲染时,您都不必一直询问属性位置是什么;你知道它是什么位置,因为你分配了它.

                  That way, if the compiler optimizes an attribute away (which is what's happening here; your fragment shader probably doesn't use one of the interpolated values), you won't care. You'll set up your arrays as normal, using a standard convention for attribute indices. Plus, you won't have to keep asking what an attribute location is every time you want to render with a different program; you know what location it is because you assigned it.

                  如果你不能/不会,那么你无能为力.如果您实际上没有使用它们,编译器将优化掉它们.您唯一能做的就是检测它返回 -1 并且不为该属性设置数组.

                  If you can't/won't, then there's nothing you can do. The compiler will optimize away attributes if you're not actually using them. The only thing you can do is detect that it returns -1 and not set up the array for that attribute.

                  这篇关于检索现有着色器属性时,glGetAttribLocation 返回 -1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:在不同的 VBO 中存储不同的顶点属性 下一篇:无法将参数 1 从“char *"转换为“LPCWSTR"

                  相关文章

                  最新文章

                      <bdo id='ir1Zj'></bdo><ul id='ir1Zj'></ul>

                    1. <legend id='ir1Zj'><style id='ir1Zj'><dir id='ir1Zj'><q id='ir1Zj'></q></dir></style></legend><tfoot id='ir1Zj'></tfoot>

                      <small id='ir1Zj'></small><noframes id='ir1Zj'>

                    2. <i id='ir1Zj'><tr id='ir1Zj'><dt id='ir1Zj'><q id='ir1Zj'><span id='ir1Zj'><b id='ir1Zj'><form id='ir1Zj'><ins id='ir1Zj'></ins><ul id='ir1Zj'></ul><sub id='ir1Zj'></sub></form><legend id='ir1Zj'></legend><bdo id='ir1Zj'><pre id='ir1Zj'><center id='ir1Zj'></center></pre></bdo></b><th id='ir1Zj'></th></span></q></dt></tr></i><div id='ir1Zj'><tfoot id='ir1Zj'></tfoot><dl id='ir1Zj'><fieldset id='ir1Zj'></fieldset></dl></div>