2015-04-24 162 views
0

我正在使用的OpenGL ES 2.0的安卓遊戲,我對什麼是最好的策略問題:OpenGL ES:在着色器中定義三角形顏色?

我想有由多個三角形的平面(地面)(如棋盤,每個案例爲2個三角形),並且我希望每個三角形都有一個顏色,根據它與我的「光線」的距離(可能使用三角形的中心)每幀將更新一個顏色。但我不想用插值法進行常規照明,整個三角形必須是相同的顏色。

所以我想知道它的策略是最好的:

  • 對每個三角形在運行時更新它的顏色,然後得出一個基本的片段着色器的三角形的Java類,通過顏色的統一的,
  • 仍然有一個三角形類,但它將參數傳遞給着色器(到光線的距離等),所以可以在着色器中確定顏色,或者一次繪製所有三角形,一個巨大的頂點緩衝區和一個「繪製順序」緩衝區,但在這種情況下,我不知道是否有可能使三角形中心點po在片段着色器中選擇。

我擔心第一個解決方案可能會有低性能,如果我有1000個三角形必須每幀更新。

我希望我的問題不是太亂,我會盡力說明它,如果有必要。

謝謝!

編輯:

我tryed執行第二方案,和我有一個看起來像一個片段着色器:

uniform vec4 vMinColor; 
uniform vec4 vMaxColor; 
uniform vec3 vLightPosition; 
uniform vec4 vCenterPosition; 
uniform float vLightRadius; 
uniform float vNoise; 

void main(){ 
    float dist = distance(vLightPosition, vCenterPosition); 
    if(dist > vLightRadius){ 
    gl_FragColor = vMaxColor; 
    } else { 
    vec4 colorDiff = vMaxColor - vMinColor; 
    float shade = floor(10*dist/LightRadius)/10; 
    shade = shade + vNoise; 
    vec4 color = vMinColor + shade*vMaxColor; 
    gl_FragColor = color; 
    } 
} 

我不知道它的工作原理,但。 (其實我敢肯定,當使用glGetUniformLocation傳遞制服時,我得到一個錯誤502)。

回答

0

我認爲使用一個頂點緩衝區會更好。在pi3d中,默認的安排是通過頂點,頂點+正常,頂點+正常+紋理_UV,所以我想在其中做一些非標準陰影,我可以利用'備用'值。

我意識到這可能是外來代碼(蟒蛇)涉水通過,但我做了一些緩衝的信息傳遞https://github.com/pi3d/pi3d_demos/blob/develop/SpriteMulti.py

你是否已經得到了你想要修改或者是你從頭開始一些代碼?

編輯 - 爲了使它更清晰,我會傳遞兩個額外的浮點值,它們代表每個元素的中心,這些值將用於頂點着色器中,以計算距離從光線(統一)開始的距離,片段着色器。

+0

嗯...我不知道我真的很明白你的代碼很抱歉^^'我不是那個熟悉python的傢伙,根本不用pi3d。你能告訴我我必須看的線嗎? –

+0

剛剛看到你的「編輯」。我想過類似的東西(據我所知,變化可以從頂點傳遞給片段着色器嗎?),但是我可以計算頂點着色器中三角形的中心嗎?我以爲我只知道當前頂點的知識。 –

+0

羅賓,我會創建一個緩衝區傳遞給gpu與glBufferData()有vx,vy,vz,cx,cy,cz [NB錯誤在我的編輯中我說2個額外的浮動!]其中cx,cy,cz將是三角形的中心(所以會重複3次),中心座標將作爲屬性vec3在頂點着色器中拾取。而且,是的,頂點着色器只能「知道」自己的屬性,並且不能考慮其他頂點進行計算。 – paddyg