1
我正試圖在兩個2D場景之間創建一個「過渡」效果。我有3個紋理:before
,after
和mask
。 before
和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);
}
任何想法什麼錯?
順便問一下,你正在使用GLSL着色器,這絕不可能永遠預GL 1.3的硬件來完成。因此,請停止使用15年的擴展名進行多重紋理。 –
@ChristianRau:頭腦更具體一些?相同的基本模型適用於其他多紋理代碼。我沒有深入的OpenGL知識,特別是關於歷史上的「好」和歷史上的「壞」以及最新的時尚是什麼,所以在這方面的任何澄清都是值得歡迎的。 –
@MasonWheeler:你能提供繪圖和紋理設置代碼的更多部分嗎?着色器確實對我來說確實很好。 – derhass