2016-11-29 48 views
0

我完全不熟悉OpenGL,所以我認爲我可能在這裏做了一些愚蠢的事情。基本上我只是試圖對我創建的緩衝區對象進行內存映射,但glMapBuffer()正在返回NULL並給出了錯誤代碼GL_INVALID_ENUM。這裏是一個的失敗的相關代碼:GL_INVALID_ENUM with glMapBuffer()

glGenVertexArrays(1, &m_vao); 
glBindVertexArray(m_vao); 

glGenBuffers(1, &m_vertex_buffer); 
glNamedBufferStorage(m_vertex_buffer, 
        BUFFER_SIZE, 
        NULL, 
        GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_DYNAMIC_STORAGE_BIT); 

glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer); 
void* vertex_buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY); 
if (!vertex_buffer) 
{ 
    GLenum error = glGetError(); 
    fprintf(stderr, "Buffer map failed! %d (%s)\n", error, gluErrorString(error)); 
    return; 
} 
glUnmapBuffer(GL_ARRAY_BUFFER); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

這是印刷:

Buffer map failed! 1280 (invalid enumerant) 

the docs,如果目標不是可用目標枚舉的人會返回錯誤。也就是說,GL_ARRAY_BUFFER肯定列爲可用。

我只是在這裏做錯了什麼?

+0

「*我只是在這裏做得不對*?」你的意思是,除了不使用DSA功能映射緩衝區?你已經在使用'glNamedBufferStorage';爲什麼不把它與DSA進行映射呢? –

+0

@NicolBolas,我嘗試使用glNamedBufferStorage,但也有同樣的問題(除了錯誤代碼是GL_INVALID_OPERATION)。我根據理論認爲它可能會得到我的司機更好的支持,我又回到了舊版本。雖然沒有運氣。 –

+0

^我的意思是glMapNamedBuffer,對不起。編輯評論的時間太晚了。 (順便說一句,我剛剛看到你的個人資料 - 我實際上一直在閱讀你的OpenGL教程,感謝你把它們放在一起)。 –

回答

0

在情況下,它可以幫助別人,我有多個問題:

  • glGetError()返回從錯誤的隊列中的第一個值。我以爲我得到的GL_INVALID_ENUM實際上是來自以前的(無關的)呼叫。
  • this threadglGenBuffers()分配一個新的緩衝區名,但緩衝實際上不是創建,直到它被綁定到使用glBindBuffer()上下文。我反而立即致電glNamedBufferStorage(),這導致了GL_INVALID_OPERATION,因爲緩衝區實際上還沒有存在。所以基本上我應該在使用DSA時總是使用glCreate*()而不是glGen*()
  • 相信glNamedBufferStorage()不變緩衝區和glNamedBufferData()是可以修改的緩衝區,雖然我不是從文件完全清楚。無論如何,我現在正在使用glNamedBufferData()

我現在能夠成功地映射和以下安裝後寫信給我的緩衝區:

glCreateBuffers(1, &m_vertex_buffer); 
glNamedBufferData(m_vertex_buffer, BUFFER_SIZE, NULL, GL_DYNAMIC_DRAW); 
void* vertex_buffer_ptr = glMapNamedBuffer(m_vertex_buffer, GL_WRITE_ONLY); 
相關問題