#opengl #opentk
#opengl #opentk
Вопрос:
Пишу простую игру, которая поможет изучить OpenGL. В текущей версии мой метод рендеринга рисует некоторые геометрические квадраты с определенными кодом цветами, а затем отображает некоторые спрайты. Пока все нормально и работает так, как задумано. Мои спрайты имеют в качестве фона цвет Auqua, который я собирался установить на прозрачный, но пока не сделал этого. Итак, на данный момент игра выглядит нормально, за исключением того факта, что все спрайты отображаются ограниченными синим цветом. Я нахожусь в точке, где я хочу, чтобы синий исчез и вместо этого был прозрачным, поэтому я изменяю свой метод OnLoad, чтобы быть:
...
Bitmap bitmap = new Bitmap("RockTexture.bmp"); // existing line
bitmap.MakeTransparent(Color.Aqua); // new line
...
Однако теперь, когда я запускаю свою игру, все квадраты геометрии исчезают с экрана! Мои спрайты остаются и выглядят соответственно прозрачными.
Я не уверен, почему это происходит. Вот мой метод рендеринга:
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit);
GL.Begin(BeginMode.Quads);
Color prevColor = default(Color);
foreach (var quad in _view.GeomitryList)
{
if (prevColor != quad.Color)
{
GL.Color4(quad.Color);
prevColor = quad.Color;
}
GL.Vertex2(quad.UpperLeftBound.X, quad.UpperLeftBound.Y);
GL.Vertex2(quad.LowerRightBound.X, quad.UpperLeftBound.Y);
GL.Vertex2(quad.LowerRightBound.X, quad.LowerRightBound.Y);
GL.Vertex2(quad.UpperLeftBound.X, quad.LowerRightBound.Y);
}
GL.Color4(_unitColor); // reset color multiplier to not scew textures
prevColor = _unitColor;
GL.BindTexture(TextureTarget.Texture2D, _rockTextureId);
foreach (var sprite in _view.SpriteList)
{
float ulX = sprite.UpperLeftBound.X;
float ulY = sprite.UpperLeftBound.Y;
float lrX = sprite.LowerRightBound.X;
float lrY = sprite.LowerRightBound.Y;
GL.TexCoord2(0, 0); GL.Vertex2(ulX, ulY);
GL.TexCoord2(1, 0); GL.Vertex2(lrX, ulY);
GL.TexCoord2(1, 1); GL.Vertex2(lrX, lrY);
GL.TexCoord2(0, 1); GL.Vertex2(ulX, lrY);
}
RenderDashboard(ref prevColor);
GL.End();
GL.Flush();
SwapBuffers();
}
Комментарии:
1. Почему вы используете этот грубый метод цветовой манипуляции? Просто используйте какой-нибудь формат файла, который поддерживает альфа-канал.
2. @datenwolf Я получаю такое же поведение при использовании .png, который имеет альфа-компонент (даже при исключении вызова make transparent)
Ответ №1:
Предположим, вы устанавливаете альфа-канал в своей MakeTransparent
функции, вам также необходимо включить смешивание:
защищенное переопределение аннулирует OnRenderFrame (FrameEventArgs e) { база.OnRenderFrame (e);
GL.Clear(ClearBufferMask.ColorBufferBit);
GL.Begin(BeginMode.Quads);
Color prevColor = default(Color);
foreach (var quad in _view.GeomitryList)
{
if (prevColor != quad.Color)
{
GL.Color4(quad.Color);
prevColor = quad.Color;
}
GL.Vertex2(quad.UpperLeftBound.X, quad.UpperLeftBound.Y);
GL.Vertex2(quad.LowerRightBound.X, quad.UpperLeftBound.Y);
GL.Vertex2(quad.LowerRightBound.X, quad.LowerRightBound.Y);
GL.Vertex2(quad.UpperLeftBound.X, quad.LowerRightBound.Y);
}
vvv
GL.Enable(GL_BLEND);
^^^
GL.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GL.Color4(_unitColor); // reset color multiplier to not scew textures
prevColor = _unitColor;
GL.BindTexture(TextureTarget.Texture2D, _rockTextureId);
foreach (var sprite in _view.SpriteList)
{
float ulX = sprite.UpperLeftBound.X;
float ulY = sprite.UpperLeftBound.Y;
float lrX = sprite.LowerRightBound.X;
float lrY = sprite.LowerRightBound.Y;
GL.TexCoord2(0, 0); GL.Vertex2(ulX, ulY);
GL.TexCoord2(1, 0); GL.Vertex2(lrX, ulY);
GL.TexCoord2(1, 1); GL.Vertex2(lrX, lrY);
GL.TexCoord2(0, 1); GL.Vertex2(ulX, lrY);
}
GL.End(); // I think this should go here.
GL.Disable(GL_BLEND); // enable and disable on a as-needed base
RenderDashboard(ref prevColor);
GL.Flush();
SwapBuffers();
Кстати: вы используете там вызовы немедленного режима (glBegin (…), glVertex (…), glEnd ()), вам следует отказаться от них и вместо этого использовать массивы вершин и объекты буфера вершин. Немедленный режим устарел, он больше недоступен в OpenGL-3 и более поздних версиях за пределами профиля совместимости.
Комментарии:
1. спасибо за совет. К сожалению, добавление этих строк, похоже, не изменило поведение программы. 🙁 У вас есть еще какие-либо предложения? Спасибо.
2. @Dejas: вы можете опубликовать скриншот?