OpenGL,将透明纹理与对象颜色混合

时间:2014-04-19 00:48:28

标签: c++ opengl textures fragment-shader

我可以将片段着色器设置为显示对象的颜色或对象的纹理颜色。我的问题是,如何将这两者结合起来,以便我可以用砖块的透明图片,然后在下面显示不同的颜色,这样通过改变对象的颜色,你可以改变砖块的颜色。 / p>

我尝试在片段着色器中使用mix(),但它只向我显示了glClearColor,它是我分配给它的红色透明的insteath!

我的片段着色器:

#version 120

uniform sampler2D diffuse;

varying vec3 shared_colors;
varying vec2 shared_texCoords;

void main() {
    vec4 color = vec4(shared_colors, 1);
    vec4 texture = texture2D(diffuse, shared_texCoords);
    vec4 finalColor = vec4(mix(color.rgb, texture.rgb, 1), 1);

    gl_FragColor = finalColor;
}

编辑:添加纹理加载器功能:

void Texture::createTexture(SDL_Surface *rawImage, GLenum format) {
    //Convert to a texture of pure color pixels for OpenGL
    SDL_Surface *image = SDL_CreateRGBSurface(NULL, rawImage->w, rawImage->h, 32, 0, 0, 0, 0);
    SDL_BlitSurface(rawImage, NULL, image, NULL);

    //Generate texture
    glGenTextures(1, &m_texture);

    //Tell OpenGL to use this texture
    glBindTexture(GL_TEXTURE_2D, m_texture);

    //Set texture parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    //Generate texture from image
    glTexImage2D(GL_TEXTURE_2D, 0, 4, image->w, image->h, 0, format, GL_UNSIGNED_BYTE, image->pixels);

    m_dimension = new PixelSize(image->w, image->h);

    //Free loaded images
    SDL_FreeSurface(rawImage);
    SDL_FreeSurface(image);
}

1 个答案:

答案 0 :(得分:1)

您应该仔细查看mix (...),了解为什么使用 1 a 实际上没有任何意义(它返回ÿ)。

让我们首先考虑通常的alpha混合函数:GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA

这意味着获取源的alpha通道并将其乘以源颜色(片段颜色)并将其添加到alpha通道的反转乘以目标颜色(帧缓冲)。

AlphaBlend = Src RGBA * Src A + Dst RGBA *( 1.0 - Src A

现在,如果你看一下mix (...)的实现,它应该看起来很熟悉:

x *( 1.0 - a )+ y * a < / p>

显然,这取决于任何a!= 0.5 的值( 1.0 - 0.5 = 0.5 )更重要的是,在这种情况下,如果对{使用 1.0 值,它会完全抛出您的一种颜色{1}}(因为它将 x 乘以 0.0 )。