我剛剛將我的代碼切換到使用單獨的着色器,而不是傳遞布爾均勻來決定使用哪種算法。不幸的是,經過嚴格的測試後,我發現其中一個屬性(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.5
到halo == 0.0
或交換的綠色價值觀上面的語句,紅色呈現,否則呈現黃色。 我試着改變輸入緩衝區全部爲1.0進行測試,但沒有任何區別。看來光環沒有被傳遞。
此前,我有兩個着色器合併,並有一個布爾統一,以決定哪些代碼運行,它工作正常。沒有別的改變;輸入緩衝區是相同的,計數是相同的,只是我現在使用不同的着色器。 有什麼想法?
你做任何事情,以確保兩套方案使用相同的屬性指標?因爲如果你讓OpenGL分配它們,那麼不能保證屬性索引將按照你希望分配的方式分配。 –
@尼科爾·布拉斯:是的,我已經這樣做了(我只是把它添加到帖子中)。問題的屬性是「halo」,它只在shader2中使用。 –
看起來像你設置屬性並鏈接'程序'兩次。但是,然後你使用'program1'和'program2',它們沒有屬性設置... –