2011-12-10 143 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的副本。 –