GLSL令人困惑,“形状未正确渲染”,“找不到uni吗?”

时间:2019-06-20 23:31:22

标签: c++ opengl glsl glfw glew

我正在尝试传递一组顶点及其对应的颜色以进行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着色器坐标。请帮忙。

0 个答案:

没有答案