Фигуры не отображаются должным образом, GLSL сбивает с толку, 'uni not found?' - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь передать массив вершин и соответствующий им цвет для смешивания тесселяции GL. Мой код очень уродливый и, вероятно, содержит много ошибок, но главная проблема в том, что я не могу передать массив вершин и цветов в GLSL. Я хотел бы знать способ сделать это без GLSL, если это возможно. Спасибо.

Я пытался использовать устаревшие функции GLSL GL без толку, а также немного возился с моим файлом шейдера. Кажется, он не хочет отображать форму.

main.cpp void 'display ()':

    void display(void)
    {
        //glfwMakeContextCurrent(wavebricks_window);    glLoadIdentity();
        //glTranslatef(1.5f, 0.0f, -7.0f);
        for (int it =0; it<instruments.size();it++){

            alGetSourcef(instruments[it].soundsource, AL_SEC_OFFSET, &tracking);
            instruments[it].currentStep=tracking*(60/tempo);
            instruments[it].currentStep=tracking;
            instruments[it].tempo=tempo;
            instruments[it].render();




            float verts[instruments[it].voices_spinner*3];
            float colors[instruments[it].voices_spinner*4];
            std::string vertexShader;
            std::string fragmentShader;
            unsigned int indices[instruments[it].voices_spinner*3];
            for (int i=0;i<instruments[it].voices_spinner;i++){
                indices[i]=i;
            }
            for (int i=instruments[it].voices_spinner-1;i>=0;i--){
                indices[instruments[it].voices_spinner+i]=instruments[it].voices_spinner-1-i;
            }
            for (int i=instruments[it].voices_spinner-1;i>=0;i--){
                indices[instruments[it].voices_spinner*2+i]=i;
            }
            for(int i=0; i<instruments[it].voices_spinner; i++){
                verts[3*i]=instruments[it].instrumentPoly[i][0];
                cout<<"\n"<<verts[3*i]<<",";
                verts[3*i+1]=instruments[it].instrumentPoly[i][1];
                cout<<verts[3*i+1]<<",";
                verts[3*i+2]=instruments[it].instrumentPoly[i][2];
                cout<<verts[3*i+2]<<":";
                colors[4*i]=-instruments[it].instrumentPoly[i][3];
                cout<<colors[4*i]<<",";
                colors[4*i+1]=-instruments[it].instrumentPoly[i][4];
                cout<<colors[4*i+1]<<",";
                colors[4*i+2]=-instruments[it].instrumentPoly[i][5];
                cout<<colors[4*i+2]<<";\n";
                colors[4*i+3]=1.0f;

            }

            Renderer renderer;
            renderer.Clear();
            VertexArray va;
            VertexBuffer vb(verts, instruments[it].voices_spinner*3*4);

            Shader shader("shade.shader", "shader2.shader");

            VertexBufferLayout layout;
            layout.Push<float>(3);
            va.AddBuffer(vb, layout);
            IndexBuffer ib(indices,instruments[it].voices_spinner * 3*4);
            //shader.Bind();


            shader.SetUniform4f("u_Color",0.8f,0.3f,0.8f,1.0f);

            //va.Bind();
            //ib.Bind();
            //GLint MaxPatchVertices = 0;
            //glGetIntegerv(GL_MAX_PATCH_VERTICES, &MaxPatchVertices);
            //printf("Max supported patch vertices %d\n", MaxPatchVertices);
            glPatchParameteri(GL_PATCH_VERTICES, instruments[it].voices_spinner*3);
            renderer.Draw(va, ib, shader);
            float r = 0.0f;
            float increment=0.05f;
            /*va.Unbind();
            vb.Unbind();
            ib.Unbind();
            shader.Unbind();*/
        }


    }

shader.shader:

    #version 420
    #extension GL_ARB_separate_shader_objects : enable

    uniform vec3 initialUniform = vec3(1.0, 0.0, 0.0);
    layout(vertices = 128) uniform initialUniform out;



    void main(){

        gl_out[gl_InvocationID].gl_Position= gl_in[gl_InvocationID].gl_Position;// and then set tessellation levels

    }
    in gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[]
    } gl_in[gl_PatchVerticesIn];



shader2.shader:


    #version 420
    #GL_ARB_separate_shader_objects : enable

    uniform vec3 initialUniform = vec3(1.0, 0.0, 0.0);

    layout (triangles, equal_spacing, ccw) uniform initialUniform in;

    out vec4 color;
    void main()
    {
        float u=gl_TessCoord.x;
        float omu= 1-u;
        float v = gl_TessCoord.y;
        float omv = 1-v;
        float m = gl_TessCoord.z;
        float omm = 1-m;

        color = gl_TessCoord;

        gl_Position =
        omu * omv  * gl_in[0].gl_Position +
        u* omv * gl_in[1].gl_Position +
        u*v*gl_in[2].gl_Position+
        omu*v*gl_in[3].gl_Position;
    }
    in gl_PerVertex {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[]
    } gl_in[gl_PatchVerticesIn];

    out gl_PerVertex
    {
        vec4 gl_Position;
        float gl_PointSize;
        float gl_ClipDistance[]
    };

Я ожидаю увидеть на экране переменные фигуры с их вычисленными вершинами и цветами. Вместо этого я ничего не вижу. На самом деле, я пытаюсь создать мозаику с треугольниками и даже не знаю, как настроить координаты 3D-шейдеров. Пожалуйста, помогите.

...