2012-09-04 43 views
1

因此,即使使用2個不同的着色器呈現問題。我目前正在渲染代表骰子的形狀,我想要的是,如果用戶選擇了骰子,則通過將骰子完全繪製爲紅色並略微放大來繪製輪廓,然後將適當的骰子放在它上面。目前,由於某種原因,某些骰子爲輪廓提供了錯誤的骰子,但是爲正確的前景骰子提供了正確的骰子。2使用相同頂點數據的着色器

林想知道他們是否沒有得到他們的頂點數據以某種方式混淆。林不知道,如果做這樣的事情,即使是允許在OpenGL:

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); 

glEnableVertexAttribArray(effect->vertCoord);   
glVertexAttribPointer(effect->vertCoord, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glEnableVertexAttribArray(effect->toon_vertCoord);   
glVertexAttribPointer(effect->toon_vertCoord, 3, GL_FLOAT, GL_FALSE, 0, 0); 

我嘗試綁定的頂點數據在這裏2個不同的着色器 當我加載我的第一個着色器,我有:

vertCoord = glGetAttribLocation(TexAndLighting, "position"); 

和其他着色器:

toon_vertCoord = glGetAttribLocation(Toon, "position"); 

如果我單獨使用每個他們的工作很好,但其他的陰影時,我嘗試呈現兩個一個在另一個他們GE的頂部這個模型混合了一些時間。這裏是我的繪製函數的樣子:

- (void) draw { 
[EAGLContext setCurrentContext:context]; 

glBindVertexArrayOES(_vertexArray); 

effect->modelViewMatrix = mvm; 
effect->numberColour = GLKVector4Make(numbers[colorSelected].r, numbers[colorSelected].g, numbers[colorSelected].b, 1); 
effect->faceColour = GLKVector4Make(faceColors[colorSelected].r, faceColors[colorSelected].g, faceColors[colorSelected].b, 1); 

if(selected){ 
    [effect drawOutline]; //this function prepares the shader 
    glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0); 
} 

[effect prepareToDraw]; //same with this one 
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0); 
} 

這是什麼樣子,你可以看到大部分的輪廓都使用了錯誤的骰子,或者根本就沒有: picture of dice

鏈接到全代碼:
http://pastebin.com/yDKb3wrD Dice.mm //渲染的東西
http://pastebin.com/eBK0pzrK Effects.mm //着色器的東西
http://pastebin.com/5LtDAk8J //我的着色器,不應該是任何與他們雖然

TL; DR:嘗試使用2個不同的着色器,它們使用相同的頂點數據,但在同時使用兩個渲染時混合起來,這就是我認爲出錯的地方,實際上很難過。

回答

2

你是正確的,因爲這是不允許的(或者更確切地說,它不會做你認爲):

glEnableVertexAttribArray(effect->vertCoord);   
glVertexAttribPointer(effect->vertCoord, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glEnableVertexAttribArray(effect->toon_vertCoord);   
glVertexAttribPointer(effect->toon_vertCoord, 3, GL_FLOAT, GL_FALSE, 0, 0); 

屬性沒有特別的聯動着色器。你不能告訴OpenGL「屬性N用於該着色器,而屬性M用於該其他着色器。」

屬性只是簡單地綁定到索引,並且任何恰好在該索引處具有輸入的着色器都會吸引最後綁定到該特定索引的數據。

所以,如果你有兩個着色器,讓我們稱之爲「香椿」和「正常」,這有以下輸入(這是假設):

normal 
    input vertCoord (index = 0) 
    input texCoord (index = 1) 

toon 
    input toon_vertCoord (index = 0) 
    input toon_somethingElse (index = 1) 

然後,當你運行該代碼:

glEnableVertexAttribArray(effect->vertCoord);   
glVertexAttribPointer(effect->vertCoord, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glEnableVertexAttribArray(effect->toon_vertCoord);   
glVertexAttribPointer(effect->toon_vertCoord, 3, GL_FLOAT, GL_FALSE, 0, 0); 

draw_normal_object(); 

您的effect->vertCoord不再與任何東西綁定,因爲toon_vertCoord具有相同的索引,並且您已覆蓋輸入指針。所以在這裏你的正常着色器將從toon_vertCoord採樣,並且一切都會搞砸。

你想要做的是啓用指針的所有屬性爲「普通着色器」,繪製正常的對象,然後切換到卡通着色器,啓用/指針所有的卡通屬性,然後繪製卡通對象。

+0

不要忘記,您可以在鏈接之前使用'glBindAttribLocation'來爲着色器上的特定頂點屬性指定屬性索引。 –

+0

啊,謝謝你們(再次,因爲你們兩個回答我的最後一個問題),我儘快嘗試一下。正如你可以看到即時通訊仍在學習OpenGL:P – Fonix

+0

這是你想到你的答案? http://pastebin.com/KbjYym6q 它似乎工作的大部分,除了我得到一個奇怪的問題,其中像第一個着色器(香椿/輪廓着色器)不使用其着色器,並且只有片段着色器,原因它獲得的顏色是正確的,只是沒有按照它的意圖擴展模型(可以在我的問題的鏈接中查看我的着色器)。我必須禁止繪製一種能夠看到另一種的方式,他們不會在同一時間工作,這很奇怪。 – Fonix