AMcoder - javascript, python, java, html, php, sql

OpenGL shaders. միատեսակ փոփոխականները սխալ են

Ես ուզում եմ կատարել bump/normal/parallax քարտեզագրում, բայց դրա համար ինձ անհրաժեշտ է բազմապատկերում. օգտագործել միանգամից 2 հյուսվածք՝ մեկը գույնի և մեկը՝ բարձրության քարտեզի համար: Բայց այս առաջադրանքի կատարումը անհեթեթորեն խնդրահարույց երևաց։

Ես ունեմ հետևյալ ծածկագիրը vertex shader-ի համար.

    #version 330 core

    /* 0: in
     * 1: out
     * 2: uniform
     */

    // 0: in
    layout (location = 0) in vec3 v_vertexPos;
    layout (location = 1) in vec2 v_vertexTexCoord;

    // 1: out
    out vec2 f_vertexTexCoord;

    // 2: uniform
    uniform mat4 vertexMvp = mat4( 1.0f );

    void main()
    {
        f_vertexTexCoord = v_vertexTexCoord;
        gl_Position = vertexMvp * vec4( v_vertexPos, 1.0f );
    }

և առաջին հատվածի համար հետևյալը.

    #version 330 core

    /* 0: in
     * 1: out
     * 2: uniform
     */

    // 0: in
    in vec2 f_vertexTexCoord;

    // 1: out
    layout (location = 0) out vec4 f_color;

    // 2: uniform
    uniform sampler2D cTex;
    uniform sampler2D hTex;

    // #define BUMP

    void main()
    {
        vec4 colorVec = texture2D( cTex, f_vertexTexCoord );

    #ifdef BUMP
        vec4 bumpVec = texture2D( hTex, f_vertexTexCoord );
        f_color = vec4( mix( bumpVec.rgb, colorVec.rgb, colorVec.a), 1.0 );
    #else
        f_color = texture2D( cTex, f_vertexTexCoord );
    #endif
    }

Շեյդերները կազմվում և կցվում են շեյդեր ծրագրին: Ծրագիրը այնուհետև կապվում է, այնուհետև օգտագործվում է: Միակ հաղորդված ակտիվ միասնական փոփոխականները glGetActiveUniform են vertex shader-ի միատեսակ vertexMvp-ը և հատվածի մեկ cTex-ը: hTex-ը չի ճանաչվում, և դրա գտնվելու վայրի հարցումը ստացվում է -1: GL_ARB_multitexture OpenGL ընդլայնումն ապահովված է գրաֆիկական քարտով (աջակցում է OpenGL տարբերակը մինչև 4.3):

Փորձարկվել է այստեղ տրված պարզ բազմապատկերային օրինակը, որն ունի միայն հատվածի ստվեր: օգտագործելով ֆոնդային գագաթը մեկ: Այս օրինակն աշխատում է հմայքի պես:

Կա՞ն առաջարկներ:


  • Եթե ​​համազգեստները չեն օգտագործվում, ստվերային կոմպիլյատորը կօպտիմալացնի դրանք: Այս դեպքում դուք կստանաք -1 որպես դրանց գտնվելու վայրը: 20.02.2014
  • Միանգամայն ճիշտ պատասխան. 20.02.2014
  • Դա սխալ չէ: Դուք ունեք ձեր shader-ի այն մասը, որն իրականում օգտագործում է hTex նախապես մշակված: Կապակցիչը կորոշի, որ համազգեստը կապակցված ծրագրում անգործուն է, և ոչ մի միասնական տեղ չի նշանակվի: Սա ինքնին օպտիմալացում չէ, և կոմպիլյատորն էլ այն չէ: 20.02.2014

Պատասխանները:


1

«GLSL կոմպիլյատորներն ու կապակցիչները փորձում են հնարավորինս արդյունավետ լինել: Հետևաբար, նրանք անում են ամեն ինչ՝ վերացնելու ծածկագիրը, որը չի ազդում փուլի արդյունքների վրա: Այդ իսկ պատճառով, shader ֆայլում սահմանված համազգեստը պարտադիր չէ, որ հասանելի լինի ֆայլում: կապակցված ծրագիր: Այն հասանելի է միայն այն դեպքում, եթե այդ համազգեստն օգտագործվում է կոդով, որն ազդում է փուլի արդյունքի վրա, և որ համազգեստն ինքնին կարող է փոխել բեմի ելքը:

Հետևաբար, համազգեստը, որը բացահայտվում է ամբողջությամբ կապված ծրագրի միջոցով, կոչվում է «ակտիվ» համազգեստ; ցանկացած այլ համազգեստ, որը նշված է բնօրինակ շեյդերների կողմից, անգործուն է: Անգործուն համազգեստը չի կարող օգտագործվել ծրագրում որևէ բան անելու համար»: - OpenGL.org

Քանի որ BUMP-ը սահմանված չէ ձեր հատվածի ստվերում, hTex-ը չի օգտագործվում ձեր կոդում, ուստի այն ակտիվ համազգեստ չէ: Սա սպասելի պահվածք է։

20.02.2014
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..