2016-01-06 165 views
1

試圖修改Android Developer OpenGL Tutorial中的三角形頂點顏色值。三角形呈現,但顯得黑暗。顏色緩衝區有什麼問題?OpenGL ES 2.0中片段着色器的非均勻顏色值

public class Triangle { 

    ... 

添加了以下幾行來建立顏色緩衝區。這是必要的嗎?

private FloatBuffer colorBuffer; 
    static final int COLORS_PER_VERTEX = 4; 

    static float triangleColors[] = { 
      0.6f, 0.2f, 0.2f, 1.0f, 
      0.2f, 0.6f, 0.2f, 1.0f, 
      0.9f, 0.9f, 0.2f, 1.0f 
    }; 

    private final int colorStride = COLORS_PER_VERTEX * 4; 

用下面的着色器代碼,取代了原來的「均勻vec4 vColor」與屬性,而不是改變,因爲沒有GLES20.getVaryingLocation。

private final String vertexShaderCode = 
     "attribute vec4 vPosition;void main(){gl_Position = vPosition;}"; 

    private final String fragmentShaderCode = 
      "precision mediump float;" + 
        //originally uniform, use varying? 
        "attribute vec4 vColor;" + 
        "void main() {" + 
        " gl_FragColor = vColor;"+ 
        "}"; 

在構造函數中:

public Triangle() 
    { 
     ... 

     ByteBuffer cb = ByteBuffer.allocateDirect(triangleColors.length * 4); 
     cb.order(ByteOrder.nativeOrder()); 
     colorBuffer = cb.asFloatBuffer(); 
     colorBuffer.put(triangleColors); 
     colorBuffer.position(0); 

     ... //compile and link shaders code is unchanged 
    } 

    public void draw() 
    { 
     GLES20.glUseProgram(mProgram); 

     ... 

     /* 
     mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); 
     GLES20.glUniform4fv(mColorHandle, 1, color, 0); 
     */ 

     mColorHandle = GLES20.glGetAttribLocation(mProgram, "vColor"); 
     GLES20.glEnableVertexAttribArray(mColorHandle); 
     GLES20.glVertexAttribPointer(mColorHandle, COLORS_PER_VERTEX, 
       GLES20.GL_FLOAT, false, colorStride, colorBuffer); 

     GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 
     GLES20.glDisableVertexAttribArray(mColorHandle); 

    } 

} 

回答

1

你是誤會什麼是統一的,屬性和變化。

要做改變你正在描述你需要一個屬性和變化。頂點着色器必須包含顏色的屬性,例如attribute vec4 aColor;和變化的輸出爲varying vec4 vColor;。然後在主要你需要分配的顏色爲vColor = aColor;。在片段着色器中,您只需要varying vec4 vColor;並按照您在主要方法中使用的方法使用它。

爲了解釋什麼,這些都有點:

  • 的屬性和統一的十分相似,但屬性是每個頂點,而統一爲每繪圖調用(將對所有頂點相同的值,片段)。它們都是爲了在CPU和GPU之間進行通信而設計的(您可以通過這兩種方式將數據發送到GPU)。
  • 變化有點不同。通常從屬性分配變量,並在頂點着色器中完成。這意味着每個頂點將從屬性中擁有自己的值,但是在光柵化完成之後,每個變化值將根據片段相對於邊界頂點的位置進行插值。所以變化被設計爲在頂點和片段着色器之間進行通信(從頂點發送數據到片段着色器)。

這是最簡單的解釋,由2點(A,B)定義的線上,並假設你的渲染緩衝區線將需要100像素。如果第一行有白色C1 = (1,1,1,1),第二行有黑色C2 = (0,0,0,1)。您將在頂點着色器中爲變化的值分配相同的顏色,並且將爲每個像素調用100次片段着色器。現在片段着色器中變化的顏色將具有位置X的內插值,如

color = C1 + (C2-C1)*((X-A).length()/(B-A).length())

所以對於100個像素的情況下的第46像素將是

color = (1,1,1,1)-(1,1,1,0)*(64/100)

這導致(.36, .36, .36, 1.0)。 因此像素將從A線性褪色到B,這將產生一個很好的漸變。

我希望這會清理一些東西。

+0

太棒了,這清除了它。感謝徹底的迴應! –

相關問題