为什么这个简单的遮罩着色器失败了?

时间:2013-08-01 16:46:25

标签: opengl glsl shader

我正在尝试在两个2D场景之间创建“过渡”效果。我有3个纹理:beforeaftermaskbeforeafter不言自明。 mask是一个简单的单色纹理,用于定义前两个如何合成。它随着时间的推移而变化,以执行转换。所有3种纹理都是相同的大小。

我已经验证了所有3个纹理都包含正确的数据,但是当我尝试执行合成时,我最终得到before或者after整体,看似随意。

这就是我正在做的事情:

申请代码:

glEnable(GL_MULTISAMPLE);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
after.handle.bind;
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
mask.handle.bind;
glActiveTextureARB(GL_TEXTURE0_ARB);
before.handle.bind;
GShaders.UseShaderProgram(maskProgramHandle); //GShaders: Global shader engine
GShaders.SetUniformValue(maskProgramHandle, 'before', 0);
GShaders.SetUniformValue(maskProgramHandle, 'after', 1);
GShaders.SetUniformValue(maskProgramHandle, 'mask', 2);
before.DrawFull; //draws the texture to the screen as a quad.
glDisable(GL_MULTISAMPLE);

顶点着色器:

varying vec4 v_color;
varying vec2 texture_coordinate; 

void main() 
{ 
  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
  texture_coordinate = vec2(gl_MultiTexCoord0); 
  v_color = gl_Color;
  gl_FrontColor = gl_Color; 
}

片段着色器:

uniform sampler2DRect before;
uniform sampler2DRect after;
uniform sampler2DRect mask;
varying vec2 texture_coordinate; 

void main()
{   
   vec3 maskValue = texture2DRect(mask, texture_coordinate).rgb;
   float alpha = (maskValue.r + maskValue.g + maskValue.b) / 3.0;
   vec4 beforeValue = texture2DRect(before, texture_coordinate);
   vec4 afterValue = texture2DRect(after, texture_coordinate);

   gl_FragColor = mix(beforeValue, afterValue, alpha);
}

知道出了什么问题吗?

1 个答案:

答案 0 :(得分:0)

这只是猜测,你试过这个吗?

gl_FragColor = mix(beforeValue, afterValue, alpha / 255.0f);