Отправка нескольких текстур, используя по одной, используя несколько sampler2D? - PullRequest
1 голос
/ 21 апреля 2019

Итак, я сделал сетку в Maya, написал некоторый код для импорта его в буфер вершин, и пока все хорошо, но сетка имеет несколько компонентов, которым назначены разные текстуры, и я решил, что легко вставить ключ в vertbuffer изапустите оператор switch (и из того, что я могу почерпнуть из этого поста , что не так уж плохо), и отправьте необходимые текстуры для всей сетки через униформу и выберите их с помощью ключа, но, как я реализовываля заметил, что для этого потребуется несколько sampler2D, и мне было интересно, повлечет ли это загрузку нескольких, в основном, неиспользуемых текстур на каждый пиксель, и будет ли это пустой тратой?

GLchar* MeshFragmentShader =    //also known as pixel shader
    "#version 330 core\n"   //version 3, not 440 >> 450
    "\n"                    //GLSL 3, core = non-depricated
    "layout(location = 0) out vec4 color;\n"
    "\n"
    "in vec2 v_TexCoord;\n"
    "in vec4 v_color;\n"
    "in float v_lightval;\n"
    "\n"
    "uniform sampler2D u_Texture;\n"//<<multiple samplers?
    "\n"
    "void main()\n"
    "{\n"
    "   int i = 0;\n"//<<texture/color key (location = 4) Vertbuffer
    "   vec4 texColor;  \n"
    "   switch (i) {\n"
    "       case 0:\n"
    "           texColor = texture(u_Texture, v_TexCoord);\n"
    "           break;\n"
    "       case 20:\n"
    "           texColor = v_color;\n"//<<override
    "           break;\n"
    "   }   \n"
    //" texColor = texture(u_Texture, v_TexCoord);  \n"
    "   \n"//simple code certainly somthing i would like to improve
    "   vec3 Kolor = texColor.rgb * (v_lightval + 0.4f);\n"//change 0.4f to gamma
    "   color = vec4(Kolor, 1.0f);\n"
    //WORKING
    //" vec4 texColor = texture(u_Texture, v_TexCoord);\n"
    //"   texColor.rgb *= v_lightval;\n"
    //" color = texColor;\n"
    "}\n";

ОБНОВЛЕНИЕ:
Для всех, кто сталкивался с этим иможет быть, чтобы уточнить немного, я пошел от вышеупомянутого шейдера к этому, и я добавил вершинный шейдер (и изображение) для справки;

GLchar* MeshVertexShader =
        "#version 400 core\n"   //version 3, not 440 >> 450 
        "\n"                    //GLSL 3, core = non-depricated
        "layout(location = 0) in vec4 position;\n"
        "layout(location = 1) in vec2 texCoord;\n"
        "layout(location = 2) in vec3 normal;\n"
        "layout(location = 3) in vec4 color;\n"
        "layout(location = 4) in float matid;\n"
        "\n"
        "out vec2 v_TexCoord;\n"
        "out vec4 v_color;\n"
        "out float v_matid;\n"
        "out vec3 norm;\n"
        "\n"
        "uniform mat4 u_MVP;\n"//model matrix projection matrix
        "uniform mat3 u_normalmatrix;\n"
        //"uniform bool u_LightingFlag;\n"  //had problems passing this

        "void main()\n"
        "{\n"
        "   vec4 postposition = u_MVP * position;\n"//3 line down
        "   norm = normalize( u_normalmatrix * normalize(normal) );\n"
        "   \n"
        "   gl_Position = postposition;\n"                  
        "   v_TexCoord = texCoord;\n"
        "   v_color = color;\n"
        "   \n"
        "   v_matid = matid;\n"
        "}\n";
    GLchar* MeshFragmentShader =    //also known as pixel shader
            "#version 400 core\n"   //version 4.0, not 440 >> 450
            "\n"                    //GLSL 4, core = non-depricated
            "layout(location = 0) out vec4 color;\n"
            "\n"
            "in vec2 v_TexCoord;\n"
            "in vec4 v_color;\n"
            //"in float v_lightval;\n"  
            "in float v_matid;\n"
            "in vec3 norm;\n"
            "\n"
            "uniform sampler2D u_Texture0;\n"   
            "uniform sampler2D u_Texture1;\n"   
            "uniform sampler2D u_Texture2;\n"   
            "uniform sampler2D u_Texture3;\n"   
            "uniform bool u_LightingFlag;\n"    
            "\n"
            "void main()\n"
            "{\n"
            "   float lightval;\n"
            "   if (u_LightingFlag == true){\n"
            "   vec3 light1 = normalize( vec3(-10.0f, 9.0f, -11.0f) );\n"
            "   lightval = max(dot(norm,light1),0.0f);\n"//Lambert Lighting
            "   } else {\n"
            "   lightval = 0.6f;\n"
            "   }\n"
            "   vec4 texColor;\n"
            "   for (int i = 0; i < 1; i++) {\n"        //not a loop, a goto
            "       if (v_matid < 0.1f) { texColor = texture(u_Texture0, v_TexCoord);
break; }\n"
            "       if (v_matid < 1.1f) { texColor = texture(u_Texture1, v_TexCoord);
break; }\n"
            "       if (v_matid < 2.1f) { texColor = texture(u_Texture2, v_TexCoord);
break; }\n"
            "       if (v_matid < 3.1f) { texColor = texture(u_Texture3, v_TexCoord);
break; }\n"
            "       texColor = v_color;\n"//override
            "   }\n"
            "   vec3 Kolor = texColor.rgb * (lightval + 0.4f);\n"   
            "   color = vec4(Kolor, 1.0f);\n"                       
            //" color = v_color;\n"                 
            "}\n"; 

Я сравнил его, сравнив его с версией, которая использовала только одинтекстуры, отключив VSYNC в панели управления nvidia и отслеживая gpИспользование, эффекты и метрики были действительно минимальными, так что пока все хорошо, но если кто-то знает, что я делаю что-то не так, или мог бы делать что-то лучше, чем, пожалуйста, скажите, что один цикл for-loop может использовать некоторую работу, которую я пытался использоватьпереключиться, но не смог заставить его работать частично из-за приведения типов, и я думаю о передаче дел как переменных

enter image description here

enter image description here

...