1

我正在尝试在两个 2D 场景之间创建“过渡”效果。我有 3 个纹理:beforeaftermaskbefore并且after是不言自明的。 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);
}

知道出了什么问题吗?

4

1 回答 1

0

这只是猜测,你试过吗

gl_FragColor = mix(beforeValue, afterValue, alpha / 255.0f);
于 2013-08-01T21:34:56.207 回答