2011-12-10 197 views
1

我正在爲Android應用程序的OpenGL ES 2.0。我有一個模型,其中 我應用紋理。我通過使用下面的着色器來做到這一點。它是一個簡單的着色器。透明度GLSL Android的OpenGL ES 2.0的

在下面的着色器時,紋理文件是透明的一些地方,我收到了 黑色。相反,我想找到透明的地方,並給出像RGB(0.6,0.7,0.3)這樣的特定顏色。請讓我知道如何修改下面的着色器,以在我的模型中獲取此着色器。

protected static final String mVShader = 

    "uniform mat4 uMVPMatrix;\n" + 
    "attribute vec4 aPosition;\n" + 
    "attribute vec2 aTextureCoord;\n" + 
    "varying vec2 vTextureCoord;\n" + 

    "void main() {\n" + 
    " gl_Position = uMVPMatrix * aPosition;\n" + 
    " vTextureCoord = aTextureCoord;\n" + 
    "}\n"; 

protected static final String mFShader = 

    "precision mediump float;\n" + 

    "varying vec2 vTextureCoord;\n" + 
    "uniform sampler2D uTexture0;\n" + 

    "void main() {\n" + 
    " gl_FragColor = texture2D(uTexture0, vTextureCoord);\n" + 
    "}\n"; 
+0

你是如何定義的地方「時,紋理文件是透明的」?你的意思是有一個零的阿爾法?你不能只在這些點上把特定的顏色加入到紋理中嗎? –

+0

是的,我的意思是阿爾法是零。但我想在那個地方放上不同的顏色。所以我想通過代碼來完成。請讓我知道您的意見。 – Vinodtiru

回答

0

現在最簡單的事情也只是檢查紋理顏色的alpha和輸出根據不同的顏色在此:

void main() 
{ 
    vec4 color = texture2D(uTexture0, vTextureCoord); 
    gl_FragColor = (color.a > 0.1) ? color : vec4(0.6, 0.7, 0.3, 1.0); 
} 

當然,你可以適應這個門檻,但僅使用0.0可能不由於精度問題而工作。片段着色器中的動態分支在性能方面可能不是最好的想法,但如果您說因爲顏色可能更改而不能更改紋理,這將是最簡單的方法。

如果顏色變化是在大量幀的執着,你也許還可以創建一個臨時的紋理,它包含了改變顏色的透明區域。這可以在GPU上使用上述着色器輕鬆實現,只需將其渲染到臨時紋理中即可(使用FBOs)而不是顯示幀緩衝區。

+0

非常感謝您的幫助。是的,你是對的,我的應用程序將會更快,如果我創建一個臨時紋理作爲動態顏色集將保留幾幀。但我不確定如何從FBO創建臨時紋理。對不起,我對着色器很陌生。請讓我知道可以幫助我的鏈接或示例代碼。非常感謝你的努力。 – Vinodtiru

+0

@Vinodtiru現在你每次改變顏色都不會創建臨時紋理。在創建原始紋理的同時,您也可以創建一個紋理,除此之外,您不需要將任何圖像數據放入其中(您可以調用'glTexImage2d(...,NULL)'或任何等價物用你的語言)。然後無論何時通過使用[FBO](http://www.songho.ca/opengl/gl_fbo.html)和上述着色器直接渲染到這個紋理創建的圖像數據的顏色的變化(該鏈接是用於桌面,但是如果支持FBO,則在ES中應該類似)。 –

+0

@Vinodtiru如果宗教組織,不支持,你也可以使用'glCopyTexSubImage2D',該副本從幀緩衝(你渲染成)到紋理的圖像。這將花費你一份副本,但它只是一個GPU到GPU的副本。 –