2013-08-01 102 views
1

我正試圖在兩個2D場景之間創建一個「過渡」效果。我有3個紋理:before,aftermaskbeforeafter是不言自明的。 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); 
} 

任何想法什麼錯?

+3

順便問一下,你正在使用GLSL着色器,這絕不可能永遠預GL 1.3的硬件來完成。因此,請停止使用15年的擴展名進行多重紋理。 –

+0

@ChristianRau:頭腦更具體一些?相同的基本模型適用於其他多紋理代碼。我沒有深入的OpenGL知識,特別是關於歷史上的「好」和歷史上的「壞」以及最新的時尚是什麼,所以在這方面的任何澄清都是值得歡迎的。 –

+0

@MasonWheeler:你能提供繪圖和紋理設置代碼的更多部分嗎?着色器確實對我來說確實很好。 – derhass

回答

0

這只是猜測,你有沒有試過這種

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