2012-10-17 99 views
3

我剛剛將我的代碼切換到使用單獨的着色器,而不是傳遞布爾均勻來決定使用哪種算法。不幸的是,經過嚴格的測試後,我發現其中一個屬性(halo)沒有通過新着色器傳遞。不過,它使用的其他屬性(位置)頂點屬性沒有傳遞給着色器

Abdridged代碼如下:

Java code: 
    // Attributes 
    protected static int position = 0; 
    protected static int colour = 1; 
    protected static int texture = 2; 
    protected static int halo = 3; 
    protected static int normal = 4; 

    protected static int program1; 
    protected static int program2; 

    ... 

    // Linking shader1 
    GLES20.glBindAttribLocation(program1, position, "position"); 
    GLES20.glBindAttribLocation(program1, colour, "colour"); 
    GLES20.glBindAttribLocation(program1, texture, "texCoord"); 
    GLES20.glBindAttribLocation(program1, normal, "normal"); 

    GLES20.glLinkProgram(program1);   

    ... 

    // Linking shader2 
    GLES20.glBindAttribLocation(program2, position, "position"); 
    GLES20.glBindAttribLocation(program2, halo, "halo"); 

    GLES20.glLinkProgram(program2);   

    ... 


    GLES20.glUseProgram(program1); 

    GLES20.glVertexAttribPointer(
     position, 
     3, 
     GLES20.GL_FLOAT, 
     false, 
     0, 
     buffer); 

    ... 

    //Render with program1 

    ... 

    GLES20.glUseProgram(program2); 

    GLES20.glVertexAttribPointer(
     halo, 
     1, 
     GLES20.GL_FLOAT, 
     false, 
     0, 
     doHaloBuffer); 

    GLES20.glEnable(GLES20.GL_BLEND); 
    GLES20.glDisable(GLES20.GL_DEPTH_TEST); 

    ... 

    // Using lines for testing purposes 
    GLES20.glDrawElements(GLES20.GL_LINE_LOOP, haloIndexCount, GLES20.GL_UNSIGNED_SHORT, haloIndexBuffer); 

    ... 

片段着色器只是簡單的「渲染你的質地和顏色」着色器

shader1.vsh: 
    attribute vec3 position; 
    attribute vec4 colour; 
    attribute vec2 texCoord; 
    attribute vec3 normal; 

    ... 

    varying vec2 fragTexCoord; 
    varying vec4 fragColour; 

    ... 

    // All attributes used at some point 


shader2.vsh: 
    attribute vec3 position; 
    attribute float halo; 

    varying vec4 fragColour; 

     ... 
     vec4 colour = vec4(1.0, 1.0, 0.0, 1.0); 

     if(halo > 0.5){ 
      colour.g = 0.0; 

     ... 

     } 

     fragColour = colour; 

     ... 

如果我改變halo > 0.5halo == 0.0或交換的綠色價值觀上面的語句,紅色呈現,否則呈現黃色。 我試着改變輸入緩衝區全部爲1.0進行測試,但沒有任何區別。看來光環沒有被傳遞。

此前,我有兩個着色器合併,並有一個布爾統一,以決定哪些代碼運行,它工作正常。沒有別的改變;輸入緩衝區是相同的,計數是相同的,只是我現在使用不同的着色器。 有什麼想法?

+0

你做任何事情,以確保兩套方案使用相同的屬性指標?因爲如果你讓OpenGL分配它們,那麼不能保證屬性索引將按照你希望分配的方式分配。 –

+0

@尼科爾·布拉斯:是的,我已經這樣做了(我只是把它添加到帖子中)。問題的屬性是「halo」,它只在shader2中使用。 –

+0

看起來像你設置屬性並鏈接'程序'兩次。但是,然後你使用'program1'和'program2',它們沒有屬性設置... –

回答

3

檢查,如果暈屬性被啓用只是glDrawElements渲染之前

+0

我突然覺得自己像個完整的混帳。這比它更可能。我現在檢查一下。 –

+1

@BenJaguarMarshall *「我現在檢查一下」* - 與您以前的句子的押韻模式不匹配。你可能意思是*「我現在檢查一下,如果這是一個命中,謝謝,這是一個完美的契合」*;) –

相關問題