我所拥有的是一组 3x3 网格中的 9 个正方形,用于测试此混合功能。这是想法。
通行证 1:
- 绑定纹理1(污垢)
- 使用 tex1 = Dirt 渲染方块
通行证 2:
- 绑定texture2(字母)
- 使用 tex2 = Letter W 渲染相同的正方形
这是针对游戏内编辑器的。我们希望能够在输入文本图集时更改字母的颜色。着色器应该从纹理中检查片段的 alpha 值。任何不等于 0(即可见)的东西都应更改为作为属性传递给着色器的所需颜色。
//Draw all Squares
glBindTexture(GL_TEXTURE_2D, textureID1); //Dirt Texture
for (int Index = 0; Index < 9; Index++)
{
//Pass in Vertex Positions...
//Pass in UV's...
glDrawArrays(GL_TRIANGLES, 0, 6); // From index 0 to 6 -> 2 triangle
}
//Redraw Squares with letter texture bound.
glBindTexture(GL_TEXTURE_2D, textureID2); //Letter Texture
glVertexAttrib3f(2,255,0,0); //Desired Color of letter, passed to shaders.
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.05f); //Anything with alpha < 0.05 is discarded.
//Draw all Squares
for (int Index = 0; Index < 9; Index++)
{
//Pass in Vertex Positions...
//Pass in UV's...
glDrawArrays(GL_TRIANGLES, 0, 6); // From index 0 to 6 -> 2 triangle
}
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisable(GL_ALPHA_TEST);
//Draw blue vertex dots...etc...
这是一张显示源图像的图片,以及 2 个略有不同的片段着色器的输出。连同想要的结果。
加载纹理,两者都有 alpha 通道(GL_BGRA,Targas)。我使用 GL_NEAREST 作为 MIN/MAG 过滤器。
奇怪的是,如果我在 LETTER TEXTURE 的 alpha 通道中使用 99% 白色(即 254),则此着色器对我有效,而当我使用全白(即 255)时会失败。
我尝试过启用 GL_BLEND 并使用各种 BlendFunc,但它们似乎不起作用。
我想问题是。不使用多纹理着色器,也不渲染到 FBO,这是进行这种混合的正确方法吗?