2017-10-06 6 views
-2

はなぜ投げglBindTexture()であるGL_INVALID_OPERATIONこれは私のテクスチャクラスは次のようになります

Texture* Texture::load(std::string filename) { 
    static std::unordered_map<std::string, Texture*> loadedTextures; 

    //If we already have the texture loaded, don't load it again 
    if(loadedTextures.find(filename) != loadedTextures.end()) { 
     return loadedTextures[filename]; 
    } 
    Texture* newTex = new Texture(); 

    //Load our texture with ImageMagick 
    try { 
     newTex->m_Image.read(filename); 
     newTex->m_Image.write(&newTex->m_Blob, "RGBA"); 
    } catch(Magick::Error& err) { 
     std::cout << "Could not load texture \"" << filename <<"\": " << err.what() << std::endl; 
     return nullptr; 
    } 

    //set up the texture with OpenGL 
    glGenTextures(1, &newTex->m_textureObj); 
    glBindTexture(GL_TEXTURE_2D, newTex->m_textureObj); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newTex->m_Image.columns(), newTex->m_Image.rows(), 0, GL_RGBA, GL_UNSIGNED_BYTE, newTex->m_Blob.data()); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glBindTexture(GL_TEXTURE_2D, 0); 

    //Now add it onto our list 
    loadedTextures[filename] = newTex; 

    return newTex; 
} 

void Texture::bind() { 
    glActiveTexture(GL_TEXTURE0); 

    glBindTexture(GL_TEXTURE_2D, m_textureObj); //ERROR HERE 

} 

そして、何私のレンダリング機能は、次のようになります。私はtexture-を呼び出す

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glEnableVertexAttribArray(2); 

//Now send vertices, uvs, and normals 
glBindBuffer(GL_ARRAY_BUFFER, VB); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, uv)); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_TRUE, sizeof(Vertex), (void *) offsetof(Vertex, normal)); 

//Send all our face information 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IB); 

//If we have a texture, use it 
if(ctx.texture != nullptr) { 
    ctx.texture->bind(); 
} 

//Now draw everything 
glDrawElements(GL_TRIANGLES, ctx.model->_indices.size(), GL_UNSIGNED_INT, 0); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 
glDisableVertexAttribArray(2); 

>バインド() 、OpenGLは私にこのエラーを与えます:

Error initializing OpenGL! 1282, GL_INVALID_OPERATION: The specified operation is not allowed in the current state. 

そして、私のフラグメントシェーダはテクスチャサンプラーからちょうど黒くなっています。

私はthis tutorialをフォローしようとしていましたが、どこが間違っているのか分かりません。誰が私にこのエラーが出ているのか教えてもらえますか?

+2

有効なGLコンテキストがバインドされている間にこれを呼び出してもよろしいですか?また、その特定の呼び出しからエラーが特定されたことをあなたに確かめることはできますか? – derhass

+0

'bind()'呼び出しで 'm_textureObj'の値はどれですか? – Ripi2

+0

私はそれをglGetError()のチェックで囲んだので、その呼び出しからエラーが発生していることを知っています。また、 'ctx.texture-> bind()'の呼び出しをコメントアウトするだけで、すべてうまく動作します(テクスチャはありません)。 –

答えて

0

私はOpenGLコンテキストが作成される前にglGenTextures()を呼び出していたので、有効なテクスチャオブジェクトを与えていませんでした。このエラーは、OpenGLの実行後に無効なテクスチャオブジェクトをバインドしようとしたときに後でスローされました。

関連する問題