【发布时间】:2014-07-09 05:19:31
【问题描述】:
我有一个带有两个纹理的全屏四边形。
我想根据用户选择混合任意形状的两个纹理。
例如,四边形最初是 100% 纹理 0,而纹理 1 是透明的。
如果用户通过在四边形上拖动鼠标来选择一个区域,例如一个圆形,那么 圆形区域应将纹理 0 和纹理 1 显示为半透明。
没有被圆圈包围的区域应该仍然是texture0。
请看示例图片,纹理被简化为颜色。
目前,我已经实现了在四边形上混合两个纹理,但是混合区域只能是垂直切片,因为我使用了 step() 函数。
我的碎片着色器:
uniform sampler2D Texture0;
uniform sampler2D Texture1;
uniform float alpha;
uniform float leftBlend;
uniform float rightBlend;
varying vec4 oColor;
varying vec2 oTexCoord;
void main()
{
vec4 first_sample = texture2D(Texture0, oTexCoord);
vec4 second_sample = texture2D(Texture1, oTexCoord);
float stepLeft = step(leftBlend, oTexCoord.x);
float stepRight = step(rightBlend, 1.0 - oTexCoord.x);
if(stepLeft == 1.0 && stepRight == 1.0)
gl_FragColor = oColor * first_sample;
else
gl_FragColor = oColor * (first_sample * alpha + second_sample * (1.0-alpha));
if (gl_FragColor.a < 0.4)
discard;
}
为了实现任意形状,我假设我需要创建一个与纹理 0 和纹理 1 大小相同的 alpha 蒙版纹理?
然后我将该纹理传递给碎片着色器以检查值,如果值为 0,则为纹理 0,如果值为 1,则混合纹理 0 和纹理 1。
我的方法正确吗?你能指出我的任何样本吗?
我想要OpenGL - mask with multiple textures这样的效果
但我想在我的程序中动态创建蒙版纹理,并且我想在 GLSL 中实现混合
我已经开始使用黑白蒙版纹理进行混合
uniform sampler2D TextureMask;
vec4 mask_sample = texture2D(TextureMask, oTexCoord);
if(mask_sample.r == 0)
gl_FragColor = first_sample;
else
gl_FragColor = (first_sample * alpha + second_sample * (1.0-alpha));
现在蒙版纹理是从磁盘上的图像静态加载的,现在我只需要在 opengl 中动态创建蒙版纹理
【问题讨论】:
-
感谢建议,我加了一张图片
-
你得到的那个任意形状,它是怎么定义的,是多边形模型,还是纹理?
-
我是二维的,举个简单的例子,用户只需在四边形上拖动一个区域来创建一个形状。我想我需要从拖动的形状中创建一个纹理,但不知道这是否正确
标签: c++ opengl textures glsl alphablending