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