簡體   English   中英

OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION

[英]OSX OpenGL 4.1 glEnableVertexAttribArray glDrawArrays GL_INVALID_OPERATION

我使用SDL窗口編寫了OpenGL應用程序。 在Mac OSX 10.9上運行OpenGL 4.1的Core Profile。 命令glClearColor很好用,我在屏幕上得到正確的顏色。 但是在我的渲染器內部,每次執行命令glEnableVertexAttribArrayglDrawArrays我都會遇到GL_INVALID_OPERATION錯誤。

那是代碼:

頂點着色器:

#version 410

in vec4 position;

void main(void)
{
    gl_Position = position;
}

片段着色器:

#version 410

out vec4 out_Color;

void main(void)
{
    out_Color = vec4(0.0, 1.0, 0.0, 1.0);
}

所有着色器都會編譯並鏈接到程序。 沒有鏈接錯誤!

用數據創建緩沖區:

static const float VertexBufferData[] = {
            0.75f, 0.75f, 0.0f, 1.0f,
            0.75f, -0.75f, 0.0f, 1.0f,
            -0.75f, -0.75f, 0.0f, 1.0f,
 };

 glGenBuffers(1, &m_VertexBuffer);
 glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
 glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBufferData), VertexBufferData, GL_STATIC_DRAW);
 glBindBuffer(GL_ARRAY_BUFFER, 0);

渲染:

glUseProgram(m_ShaderProgram);

glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);

glEnableVertexAttribArray(0);

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_TRIANGLES, 0, 3);

// glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);

glDisableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, 0);

glUseProgram(0);

輸出:

帶有探查器描述的我的應用程序的輸出

AS BDL已經說過:解決方案是創建VAO。 簡短描述:VAO(頂點陣列對象)是VBO的集合,它描述了着色器的頂點布局和頂點。

更多信息在這里:

因此,我更改了以下代碼塊:

緩沖:

    static const float VertexBufferData[] = {
            0.75f, 0.75f, 0.0f, 1.0f,
            0.75f, -0.75f, 0.0f, 1.0f,
            -0.75f, -0.75f, 0.0f, 1.0f,
        };

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

    glGenBuffers(1, &m_VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBufferData), VertexBufferData, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glBindVertexArray(0);

渲染:

    glUseProgram(m_ShaderProgram);

    glBindVertexArray(m_VertexBufferArray);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(0);

    glUseProgram(0);

結果:

最終的工作結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM