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

Opengl 为什么这个简单的遮罩着色器会失败?,opengl,glsl,shader,Opengl,Glsl,Shader,我试图在两个2D场景之间创建“过渡”效果。我有3种纹理:之前,之后,以及遮罩之前和之后都是不言自明的mask是一种简单的单色纹理,用于定义前两种材质的合成方式。它会随着时间的推移而变化,以执行转换。所有3种纹理的大小都相同 我已经验证了所有3个纹理都包含正确的数据,但是当我尝试执行合成时,我最终得到了整个before,或者整个before,看起来是随机的 以下是我正在做的: 申请代码: glEnable(GL_MULTISAMPLE); glActiveTextureARB(GL_TEXTURE

我试图在两个2D场景之间创建“过渡”效果。我有3种纹理:
之前
之后
,以及
遮罩
<代码>之前和之后都是不言自明的
mask
是一种简单的单色纹理,用于定义前两种材质的合成方式。它会随着时间的推移而变化,以执行转换。所有3种纹理的大小都相同

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

以下是我正在做的:

申请代码:

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);
}

知道出了什么问题吗?

这只是猜测,你试过吗

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

顺便说一句,您使用的是GLSL着色器,这在GL1.3之前的硬件上是无法实现的。所以,不要再使用15年前的多文本扩展了。@ChristianRau:介意更具体一点吗?同样的基本模型也适用于其他多文本代码。我对OpenGL没有太多深入的了解,尤其是关于什么是历史上的“好”和“坏”以及什么是最新的时尚,所以欢迎对此进行澄清。@MasonWheeler:您能提供更多的绘图和纹理设置代码吗?着色器在我看来确实不错。@MasonWheeler只是多文本是核心OpenGL的一部分,因为事实上,这就是为什么可以忽略所有函数和常量上的所有
ARB
s。无论是谁告诉你使用这些名字,都会被认为是过时的,并被其他学习资源所取代。@derhass:你还需要什么?我认为这几乎是所有相关的事情。。。