web-dev-qa-db-ja.com

OpenGL glGetError1281不正な値

頂点とシェーダーでOpenGLを使用していますが、画面に何も表示されないため、glGetErrorを使用してデバッグしました:color_array_bufferというバッファーの1つでエラー1281(不正な値)が発生しました。これが私が話しているセクションです:

    GLenum error =  glGetError();
if(error) {
    cout << error << endl; 
    return ;
} else {
    cout << "no error yet" << endl;
}
//no error


// Get a handle for our "myTextureSampler" uniform
    GLuint TextureID  = glGetUniformLocation(shaderProgram, "myTextureSampler");
    if(!TextureID)
        cout << "TextureID not found ..." << endl;

// Bind our texture in Texture Unit 0
    glActiveTexture(GL_TEXTURE0);
    sf::Texture::bind(texture);
// Set our "myTextureSampler" sampler to user Texture Unit 0
    glUniform1i(TextureID, 0);
// 2nd attribute buffer : UVs
    GLuint vertexUVID = glGetAttribLocation(shaderProgram, "color");
    if(!vertexUVID)
        cout << "vertexUVID not found ..." << endl;
    glEnableVertexAttribArray(vertexUVID);
    glBindBuffer(GL_ARRAY_BUFFER, color_array_buffer);
    glVertexAttribPointer(vertexUVID, 2, GL_FLOAT, GL_FALSE, 0, 0);

error =  glGetError();
if(error) {
    cout << error << endl; 
    return ;
}
//error 1281

そして、これが私のバッファを配列にリンクするコードです:

    if (textured) {
        texture = new sf::Texture();
    if(!texture->loadFromFile("textures/simple.jpeg"/*,sf::IntRect(0, 0, 128, 128)*/))
        std::cout << "Error loading texture !!" << std::endl;
        glGenBuffers(1, &color_array_buffer);
        glBindBuffer(GL_ARRAY_BUFFER, color_array_buffer);
        glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec3), &uvs[0], GL_STATIC_DRAW);
    }

と私のuvの値:

uvs [0]:0.748573-0.750412

uvs [1]:0.749279-0.501284

uvs [2]:0.99911-0.501077

uvs [3]:0.999455-0.75038

uvs [4]:0.250471-0.500702

uvs [5]:0.249682-0.749677

uvs [6]:0.001085-0.75038

uvs [7]:0.001517-0.499994

uvs [8]:0.499422-0.500239

uvs [9]:0.500149-0.750166

uvs [10]:0.748355-0.99823

uvs [11]:0.500193-0.998728

uvs [12]:0.498993-0.250415

uvs [13]:0.748953-0.25092

誰かが私を助けてくれるなら、私は何か間違ったことをしていますか?.

8
aze

glGetAttribLocation()が属性を見つけられなかった場合のチェックは正しくありません:

_GLuint vertexUVID = glGetAttribLocation(shaderProgram, "color");
if(!vertexUVID)
    cout << "vertexUVID not found ..." << endl;
_

glGetAttribLocation()GLintGLuintではない)を返し、指定された名前の属性がプログラムに見つからない場合、結果は_-1_になります。値をunsigned変数に割り当てるため、値は可能な限り最大のunsignedになります。これは、後でglEnableVertexAttribArray()に渡すと無効な引数になります。

代わりに、コードは次のようになります。

_GLint vertexUVID = glGetAttribLocation(shaderProgram, "color");
if(vertexUVID < 0)
    cout << "vertexUVID not found ..." << endl;
_

_0_は完全に有効な属性の場所であることに注意してください。

16
Reto Koradi