OpenGL中的贴纸/贴花:在没有CLAMP_TO_EDGE拉伸的情况下绘制纹理?

时间:2011-04-09 04:26:10

标签: opengl-es shader

基本上试图在飞机上贴标签。纹理图像显示在平面上(可以移动)但我不想将图像拉伸到边缘或重复它。我怎样才能将图像贴在墙上?我正在使用着色器,不知道这是否是我解决问题的地方。想象一下棋盘是我的形象,这就是发生的事情:

http://i.stack.imgur.com/bBDM0.gif

2 个答案:

答案 0 :(得分:1)

您可以将范围检查合并到着色器中。设置clamp_to_edge会影响从仅采样返回的像素,因此当您处于不想输出任何像素的区域时,进入着色器的纹理坐标仍将在0到1的范围之外。在今天通常用于GL ES的硬件上,传递alpha值为0的颜色要比丢弃的颜色更快,所以如果你的混合模式允许它就这样做。

E.g。假设您目前只有最简单的纹理片段着色器:

void main()
{
    gl_FragColor = texture2D(tex2D, texCoordVarying);
}

你可以选择:

void main()
{
    if(clamp(texCoordVarying, vec2(0.0, 0.0), vec2(1.0, 1.0)) == texCoordVarying)
        gl_FragColor = texture2D(tex2D, texCoordVarying);
    else
        gl_FragColor = vec4(0.0); // or discard, if you need to
}

但是,显式范围检查会增加处理成本。显然只有当它成为问题时才会担心,但在这种情况下解决方案只是在纹理中添加边框。因此,如果您的纹理是256x256,那么您将使用中心254x254像素并在外部放置一个完全透明的边框。

编辑:更清楚地思考,如果可以接受alpha而不是discard,那么你可以使用step函数来消除条件。执行四次 - 每个轴上的每个限制一次,将结果反转到您想要大于测试而不是小于的值,然后将输出alpha乘以所有四个结果。如果任何一个为零,则输出alpha将为零。

答案 1 :(得分:0)

请改用CLAMP_TO_BORDER,不要忘记设置边框颜色。