在TextureAtlas中插入纹理

时间:2014-09-12 14:50:10

标签: opengl textures shader

我正在寻找一种插入/平滑纹理图集中红色纹理的方法。

问题在于,如果我将MIN_FILTER设置为GL_LINEAR,我会在边缘出血。 (下一个纹理的像素用于插值)

我尝试通过编写一个手动进行插值的着色器来解决这个问题,但是为了检测它必须忽略哪些像素,着色器必须知道顶点的texCoords,以便它可以计算所使用的像素是在内还是外三角形。为了让texCoords进入着色器我尝试使用制服,但我使用DisplayLists(我考虑转换为VBO,但我的第一个实现使用它们并且它极其缓慢)这使得它非常复杂。

如何在不流血的情况下平滑纹理?

另一个问题是检查点是否在三角形中的方法似乎不起作用。

顶点着色器:

#version 130

void main()
{
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    gl_FrontColor = gl_Color;
    gl_Position = ftransform();
}

Fragement Shader:

#version 130

uniform sampler2D tex;
uniform vec2 texCoord[4];

float textureSize;
float texelSize;


bool pointInTriangle(vec3 P, vec3 A, vec3 B, vec3 C)
{
    vec3 u = B - A;
    vec3 v = C - A;
    vec3 w = P - A;

    vec3 vCrossW = cross(v, w);
    vec3 vCrossU = cross(v, u);

    if(dot(vCrossW, vCrossU) < 0)
    {
        return false;
    }


    vec3 uCrossW = cross(u, w);
    vec3 uCrossV = cross(u, v);

    if(dot(uCrossW, uCrossV) < 0)
    {
        return false;
    }

    float denom = length(uCrossV);
    float r = length(vCrossW);
    float t  = length(uCrossW);

    return (r + t <= 1);
}


vec4 texture2DBilinear(sampler2D textureSampler, vec2 uv)
{
    vec4 tl = texture2D(textureSampler, uv);
    vec4 tr = texture2D(textureSampler, uv + vec2(texelSize, 0));
    vec4 bl = texture2D(textureSampler, uv + vec2(0, texelSize));
    vec4 br = texture2D(textureSampler, uv + vec2(texelSize , texelSize));
    vec2 f = fract( uv.xy * textureSize );
    vec4 tA = mix( tl, tr, f.x );
    vec4 tB = mix( bl, br, f.x );
    return mix( tA, tB, f.y );
}


void main()
{
    ivec2 textureSize2d = textureSize(tex,0);
    textureSize = float(textureSize2d.x);
    texelSize = 1.0 / textureSize;

    //texture coordinate:
    vec2 texCoord = (gl_TexCoord[0].st);

    //vec4 color = texture2D(tex,gl_TexCoord[0].st);
    gl_FragColor = texture2DBilinear(tex, texCoord) * gl_Color;

    //TEST IF METHOD WORKS
    if(pointInTriangle(vec3(1,1,0),vec3(0,0,0),vec3(3,0,0),vec3(0,3,0)))
    {
        //pointInTriangle DOES NOT WORK!
        gl_FragColor = gl_Color;
    }
}

0 个答案:

没有答案