簡體   English   中英

通過頂點屬性指針將顏色坐標傳遞到頂點着色器

[英]Passing colour coords into a vertex shader through a vertex attrib pointer

我試圖將 vec3 顏色數據獲取到頂點着色器(作為屬性指針),然后將其傳遞到片段中以進行所有設置。

這一切都始於無法將紋理坐標傳遞到頂點着色器中。 我到處找,但找不到明確的解決方案。 我可以(通過在頂點着色器中手動設置顏色)為渲染器獲取一個白色方塊,但來自 VAO 的顏色數據似乎無法傳遞給它。

另外我確定着色器加載系統有效。 我最好的想法是信息沒有被傳遞到頂點着色器的“layout = 1”,但我很可能是錯的。

VAO / 緩沖區 / 着色器設置

float vert[] = {
        //Vert Locs   Normal Coords
        -0.5f,-0.5f,  1.0f,1.0f,1.0f,  //0
         0.5f,-0.5f,  1.0f,1.0f,1.0f,  //1
         0.5f,0.5f,   1.0f,1.0f,1.0f,  //2
        -0.5f, 0.5f,  1.0f,1.0f,1.0f,  //3
    };


    unsigned int index[] = {
        0,1,2, //Order of drawing vertices
        2,3,0
    };

    unsigned int vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, 5 * 4 * sizeof(float), vert, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 2, GL_FLOAT,GL_FALSE, 5 * sizeof(float), 0);
    glVertexAttribPointer(1, 3,  GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));


    glEnableVertexAttribArray(0); // vao ^^

    unsigned int ibo;
    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned int), index, GL_STATIC_DRAW);

    Shader v("VertexN.shader", GL_VERTEX_SHADER);
    Shader f("FragmentN.shader", GL_FRAGMENT_SHADER);

    unsigned int shaders2[] = {v.id, f.id};
    unsigned int program2 = Shader::getProgram(shaders2);

    glUseProgram(0);
    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

渲染循環

glClearColor(0, 0, 0, 1);
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

        glUseProgram(program2);
        //tex.bind(slot);
        glBindVertexArray(vao);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //Drawing mode, Type indecies , type of index buffer , pointer to index buffer

        glfwSwapBuffers(window);

        glfwPollEvents();

        glFlush();

        glBindVertexArray(0);
        glUseProgram(0);
        glActiveTexture(0);

頂點着色器

#version 330 core

layout(location = 0)in vec2 pos;
layout(location = 1)in vec3 normals;

out vec3 normal;

void main() {

    normal = normals;

    gl_Position = vec4(pos, 0.0f, 1.0f);

};

片段着色器

#version 330 core

layout(location = 0)out vec4 colour;

in vec3 normal;

void main() {
    colour = vec4(normal, 1.0f);
};

我不知道這里的源代碼注釋是什么:

 glEnableVertexAttribArray(0); // vao ^^

應該是這個意思。 然而,我的印象是你誤解了這個函數的作用。

GL 管理一組通用頂點屬性(規范保證至少有 16 個,也許更多),對於每個這樣的屬性,數據可以來自一個數組。 除了必須指定屬性指針和數據格式外,您還必須單獨啟用每個屬性的數組。 當進行繪制調用時,對於每個頂點索引i ,GPU 將獲取i - 屬性數組中啟用數組的每個屬性的值。 對於禁用數組的屬性,它將在整個繪制調用中使用常量值。 (您可以在發出繪制調用之前通過glVertexAttrib*()函數系列對其進行設置)。

由於您從未啟用屬性 1 的數組(着色器的normals輸入),所有頂點都會看到屬性 1 的當前值 - 很可能只是vec4(0)因為這是初始默認值,而且您似乎從未改變它。

解決方案當然是啟用要從中獲取的所有屬性數組:

glEnableVertexAttribArray(1);

而且,當你在做的時候:在你的渲染循環中,你有

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

那是沒有必要的。 VAO 已經存儲了這些信息,不需要重新綁定繪制。

暫無
暫無

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

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