OpenGL, смешивая прозрачные текстуры с цветом объекта

Я могу настроить свой фрагментный шейдер так, чтобы он отображал цвета объекта или цвет текстуры объекта. Мой вопрос состоит в том, как я могу объединить эти два, чтобы у меня была прозрачная картинка с линиями для кирпичей, а затем показать различные цвета внизу, так что, изменяя цвет объекта, вы меняете цвет кирпичей.

Я попытался использовать mix () для этого в фрагментном шейдере, но он показывает мне только glClearColor, где он прозрачен вместо красного цвета, который я ему назначил!

Мой фрагмент шейдера:

#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

Решение

Вы должны внимательно посмотреть на mix (...) чтобы понять, почему с помощью 1 за a эффективно ничего не значащего (это возвращает у).

Давайте начнем с рассмотрения обычной функции альфа-смешивания: GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,

Это значит взять альфа-канал источника и умножить его на цвет источника (цвет фрагмента) и добавьте это к обратному альфа-каналу, умноженному на цвет назначения (кадровый буфер).

  AlphaBlend знак равно SrcRGBA * Src + DstRGBA * (1,0Src)

Теперь, если вы посмотрите на реализацию mix (...) это должно выглядеть довольно знакомо:

  Икс * (1,0) + Y *

Очевидно, что это зависит от порядка для любого значения a знак равно 0,5 (1,00,5 знак равно 0,5) и что еще более важно в этом случае он полностью выбрасывает один из ваших цветов, если вы используете значение 1,0 за a (как это умножается Икс от 0.0).

1

Другие решения


По вопросам рекламы [email protected]