Вот что я делаю:
- Визуализируйте первое изображение, используя цвет:
glColor4f(1.0, 1.0, 1.0, 1.0);
- Визуализируйте второе изображение, используя цвет:
glColor4f(1.0, 1.0, 1.0, calc);
.calc
— это число, которое изменяется от 0,0 до 1,0 за секунду, и я могу убедиться, что оно действительно это делает.
Я ожидаю, что он будет переходить от одного изображения к другому, и он делает это, но на полпути он переходит в какой-то оттенок серого (кстати, черный цвет фона). О проблеме можно узнать здесь: http://www.youtube.com/watch?v=8dZXiYIM43s&feature=youtu.be .
Я просто хочу основное затухание, БЕЗ сероватого тона в середине затухания (который является самым сильным при непрозрачности 0,5). Я пытался сделать это с помощью GIMP, нижний слой непрозрачный, верхний слой имеет переменную непрозрачность, и он отлично работает, он делает точно то, что я хочу, я просто не знаю, почему мой код (или OpenGL) не будет делать то же самое. Видео, демонстрирующее, что я имею в виду: http://www.youtube.com/watch?v=Ym-VPu9hhjQ&feature=youtu.be
РЕДАКТИРОВАНИЕ: после небольшого эксперимента (изменение цвета фона на красный) при значении 0,5 он становится полупрозрачным, что обычно является желаемым эффектом, за исключением того, что ОБЕ текстура полупрозрачный (не только тот, что сверху). Почему это происходит??
Вот код:
void Sprite::render_single(Image* image, Pos2D pos, Angle angle) {
int cx = image->width / 2;
int cy = image->height / 2;
glPushMatrix();
glTranslatef(pos.x + cx, pos.y + cy, 0);
glRotatef(angle.to_degrees(), 0.0, 0.0, 1.0);
glTranslatef(-cx, -cy, 0);
image->bind();
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex2f(0.0, 0.0);
glTexCoord2f(1.0, 0.0);
glVertex2f(image->width, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex2f(image->width, image->height);
glTexCoord2f(0.0, 1.0);
glVertex2f(0.0, image->height);
glEnd();
image->unbind();
glPopMatrix();
}
void Sprite::render(Pos2D pos, Angle angle) {
Image* img = this->get_current_frame();
if (this->images.size() == 1) {
this->render_single(img, pos, angle);
return;
}
double calc = (((double)this->current_frame_overflow) / this->frame_length);
std::cout << calc << std::endl;
glPushMatrix();
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
this->render_single(img, pos, angle);
img = this->get_next_frame();
glColor4f(1.0f, 1.0f, 1.0f, calc);
this->render_single(img, pos, angle);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glPopMatrix();
}
Используемая функция смешивания: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Функция инициализации OpenGL:
/**
* @brief Initializes OpenGL
*/
void Game::init_gl() {
float width = this->display->w;
float height = this->display->h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, width, height, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
Кроме того, вот весь исходный код основного цикла (который содержит большую часть материалов OpenGL): https://github.com/MiJyn/dbab/blob/master/src/game.cpp . И спрайт: https://github.com/MiJyn/dbab/blob/master/src/sprite.cpp .
GL_SRC_ALPHA
вместоGL_ONE
работает нормально, но моя проблема все еще остается - person MiJyn   schedule 15.05.2013calc
достигает 1, он становится намного ярче, чем когда он был равен 0. В GIMP яркость остается прежней. - person MiJyn   schedule 15.05.2013glPushMatrix
, за исключением того, что оно работает для атрибутов. Хотя я могу ошибаться. Я попробую удалить его и посмотреть, работает ли он. EDIT: нет, та же проблема - person MiJyn   schedule 18.05.2013glDisable(GL_BLEND)
работает!! Не могли бы вы преобразовать его в ответ? - person MiJyn   schedule 19.05.2013