Skip to content

Commit

Permalink
Alphablend patches (#2979)
Browse files Browse the repository at this point in the history
* [skin.py] force alpha blending for svg graphics

As discussed in the SVG thread and requested by @Taapat

* Alpha blending: set some graphics loaded directly by Python code to blend mode.

This improves edge blending of PNG and SVG icons for absolutely zero real-world performance hit. With this change halos around graphics disappear.

As discussed in the SVG thread and requested by @Taapat
  • Loading branch information
Huevos committed May 11, 2021
1 parent 0639543 commit c9e5b5a
Show file tree
Hide file tree
Showing 9 changed files with 39 additions and 38 deletions.
4 changes: 2 additions & 2 deletions data/skin_default/skin.xml
Expand Up @@ -1028,8 +1028,8 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y() + (or
{"template": [
MultiContentEntryText(pos = (85, 6), size = (440, 28), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1), # index 1 is the interfacename
MultiContentEntryText(pos = (85, 43), size = (440, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, text = 2), # index 2 is the description
MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap
MultiContentEntryPixmapAlphaTest(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap
MultiContentEntryPixmapAlphaBlend(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap
MultiContentEntryPixmapAlphaBlend(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap
],
"fonts": [gFont("Regular", 28),gFont("Regular", 20)],
"itemHeight": 70
Expand Down
8 changes: 4 additions & 4 deletions lib/python/Components/MovieList.py
@@ -1,7 +1,7 @@
from GUIComponent import GUIComponent
from Tools.FuzzyDate import FuzzyTime
from ServiceReference import ServiceReference
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest, MultiContentEntryProgress
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaBlend, MultiContentEntryProgress
from Components.config import config
import os
import struct
Expand Down Expand Up @@ -396,13 +396,13 @@ def buildMovieListEntry(self, serviceref, info, begin, data):
p = os.path.split(p[0])
txt = p[1]
if txt == ".Trash":
res.append(MultiContentEntryPixmapAlphaTest(pos=(0, self.trashShift), size=(iconSize, self.iconTrash.size().height()), png=self.iconTrash))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(0, self.trashShift), size=(iconSize, self.iconTrash.size().height()), png=self.iconTrash))
res.append(MultiContentEntryText(pos=(x, 0), size=(width - x - tn - r, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | valign_center, text=_("Deleted items")))
res.append(MultiContentEntryText(pos=(width - tn - r, 0), size=(tn, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | valign_center, text=_("Trash can")))
return res
if not config.movielist.show_underlines.value:
txt = txt.replace('_', ' ').strip()
res.append(MultiContentEntryPixmapAlphaTest(pos=(0, self.dirShift), size=(iconSize, iconSize), png=self.iconFolder))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(0, self.dirShift), size=(iconSize, iconSize), png=self.iconFolder))
res.append(MultiContentEntryText(pos=(x, 0), size=(width - x - tn - r, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | valign_center, text=txt))
res.append(MultiContentEntryText(pos=(width - tn - r, 0), size=(tn, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | valign_center, text=_("Directory")))
return res
Expand Down Expand Up @@ -470,7 +470,7 @@ def buildMovieListEntry(self, serviceref, info, begin, data):
pos = (0, self.partIconeShiftOriginal)
else:
pos = (0, self.partIconeShiftMinimal)
res.append(MultiContentEntryPixmapAlphaTest(pos=pos, size=(iconSize, data.icon.size().height()), png=data.icon))
res.append(MultiContentEntryPixmapAlphaBlend(pos=pos, size=(iconSize, data.icon.size().height()), png=data.icon))
switch = config.usage.show_icons_in_movielist.value
if switch in ('p', 's'):
if switch == 'p':
Expand Down
8 changes: 4 additions & 4 deletions lib/python/Components/PluginList.py
@@ -1,7 +1,7 @@
from MenuList import MenuList

from Tools.Directories import resolveFilename, SCOPE_CURRENT_SKIN
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaBlend

from enigma import eListboxPythonMultiContent, gFont, BT_SCALE, BT_KEEP_ASPECT_RATIO, BT_HALIGN_CENTER, BT_VALIGN_CENTER
from Tools.LoadPixmap import LoadPixmap
Expand All @@ -17,7 +17,7 @@ def PluginEntryComponent(plugin, width=440):
plugin,
MultiContentEntryText(pos=(nx, ny), size=(width - nx, nh), font=0, text=plugin.name),
MultiContentEntryText(pos=(nx, dy), size=(width - dx, dh), font=1, text=plugin.description),
MultiContentEntryPixmapAlphaTest(pos=(ix, iy), size=(iw, ih), png=png, flags=BT_SCALE | BT_KEEP_ASPECT_RATIO | BT_HALIGN_CENTER | BT_VALIGN_CENTER)
MultiContentEntryPixmapAlphaBlend(pos=(ix, iy), size=(iw, ih), png=png, flags=BT_SCALE | BT_KEEP_ASPECT_RATIO | BT_HALIGN_CENTER | BT_VALIGN_CENTER)
]


Expand All @@ -27,7 +27,7 @@ def PluginCategoryComponent(name, png, width=440):
return [
name,
MultiContentEntryText(pos=(x, y), size=(width - x, h), font=0, text=name),
MultiContentEntryPixmapAlphaTest(pos=(ix, iy), size=(iw, ih), png=png)
MultiContentEntryPixmapAlphaBlend(pos=(ix, iy), size=(iw, ih), png=png)
]


Expand All @@ -47,7 +47,7 @@ def PluginDownloadComponent(plugin, name, version=None, width=440):
plugin,
MultiContentEntryText(pos=(x, y), size=(width - x, h), font=0, text=name),
MultiContentEntryText(pos=(dx, dy), size=(width - dx, dh), font=1, text=plugin.description),
MultiContentEntryPixmapAlphaTest(pos=(ix, iy), size=(iw, ih), png=png)
MultiContentEntryPixmapAlphaBlend(pos=(ix, iy), size=(iw, ih), png=png)
]


Expand Down
10 changes: 5 additions & 5 deletions lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py
Expand Up @@ -6,7 +6,7 @@
from Components.GUIComponent import GUIComponent
from Components.EpgList import Rect
from Components.Sources.Event import Event
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest, MultiContentEntryPixmapAlphaBlend
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaBlend
from Components.TimerList import TimerList
from Components.Renderer.Picon import getPiconName
from Components.Sources.ServiceEvent import ServiceEvent
Expand Down Expand Up @@ -491,7 +491,7 @@ def buildEntry(self, service, service_name, events, picon, serviceref):

res = [None]
if bgpng is not None: # bacground for service rect
res.append(MultiContentEntryPixmapAlphaTest(
res.append(MultiContentEntryPixmapAlphaBlend(
pos=(r1.x + self.serviceBorderVerWidth, r1.y + self.serviceBorderHorWidth),
size=(r1.w - 2 * self.serviceBorderVerWidth, r1.h - 2 * self.serviceBorderHorWidth),
png=bgpng,
Expand Down Expand Up @@ -524,7 +524,7 @@ def buildEntry(self, service, service_name, events, picon, serviceref):
if picon != "":
displayPicon = LoadPixmap(picon)
if displayPicon is not None:
res.append(MultiContentEntryPixmapAlphaTest(
res.append(MultiContentEntryPixmapAlphaBlend(
pos=(r1.x + self.serviceBorderVerWidth + self.number_width, r1.y + self.serviceBorderHorWidth),
size=(piconWidth, piconHeight),
png=displayPicon,
Expand Down Expand Up @@ -599,7 +599,7 @@ def buildEntry(self, service, service_name, events, picon, serviceref):
bgpng = self.othEvPix

if bgpng is not None:
res.append(MultiContentEntryPixmapAlphaTest(
res.append(MultiContentEntryPixmapAlphaBlend(
pos=(left + xpos + self.eventBorderVerWidth, top + self.eventBorderHorWidth),
size=(ewidth - 2 * self.eventBorderVerWidth, height - 2 * self.eventBorderHorWidth),
png=bgpng,
Expand Down Expand Up @@ -639,7 +639,7 @@ def buildEntry(self, service, service_name, events, picon, serviceref):

else:
if selected and self.selEvPix:
res.append(MultiContentEntryPixmapAlphaTest(
res.append(MultiContentEntryPixmapAlphaBlend(
pos=(r2.x + self.eventBorderVerWidth, r2.y + self.eventBorderHorWidth),
size=(r2.w - 2 * self.eventBorderVerWidth, r2.h - 2 * self.eventBorderHorWidth),
png=self.selEvPix,
Expand Down
19 changes: 9 additions & 10 deletions lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
Expand Up @@ -21,7 +21,6 @@
from Components.config import config, getConfigListEntry, ConfigSubsection, ConfigText, ConfigLocations, ConfigYesNo, ConfigSelection
from Components.ConfigList import ConfigListScreen
from Components.Console import Console
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
from Components.SelectionList import SelectionList
from Components.PluginComponent import plugins
from Components.About import about
Expand Down Expand Up @@ -531,13 +530,13 @@ class PluginManager(Screen, PackageInfoHandler):
{"default": (51,[
MultiContentEntryText(pos = (0, 1), size = (470, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
MultiContentEntryText(pos = (0, 25), size = (470, 24), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
MultiContentEntryPixmapAlphaTest(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
MultiContentEntryPixmapAlphaTest(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap
MultiContentEntryPixmapAlphaBlend(pos = (475, 0), size = (48, 48), png = 5), # index 5 is the status pixmap
MultiContentEntryPixmapAlphaBlend(pos = (0, 49), size = (550, 2), png = 6), # index 6 is the div pixmap
]),
"category": (40,[
MultiContentEntryText(pos = (30, 0), size = (500, 22), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
MultiContentEntryText(pos = (30, 22), size = (500, 16), font=2, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the description
MultiContentEntryPixmapAlphaTest(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap
MultiContentEntryPixmapAlphaBlend(pos = (0, 38), size = (550, 2), png = 3), # index 3 is the div pixmap
])
},
"fonts": [gFont("Regular", 22),gFont("Regular", 20),gFont("Regular", 16)],
Expand Down Expand Up @@ -976,8 +975,8 @@ class PluginManagerInfo(Screen):
{"template": [
MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
MultiContentEntryPixmapAlphaBlend(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
MultiContentEntryPixmapAlphaBlend(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
],
"fonts": [gFont("Regular", 24),gFont("Regular", 22)],
"itemHeight": 50
Expand Down Expand Up @@ -1077,8 +1076,8 @@ class PluginManagerHelp(Screen):
{"template": [
MultiContentEntryText(pos = (50, 0), size = (540, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
MultiContentEntryPixmapAlphaBlend(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
MultiContentEntryPixmapAlphaBlend(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
],
"fonts": [gFont("Regular", 24),gFont("Regular", 22)],
"itemHeight": 50
Expand Down Expand Up @@ -1527,8 +1526,8 @@ class PacketManager(Screen, NumericalTextInput):
{"template": [
MultiContentEntryText(pos = (5, 1), size = (440, 28), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
MultiContentEntryText(pos = (5, 26), size = (440, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 2 is the description
MultiContentEntryPixmapAlphaTest(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
MultiContentEntryPixmapAlphaTest(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap
MultiContentEntryPixmapAlphaBlend(pos = (445, 2), size = (48, 48), png = 4), # index 4 is the status pixmap
MultiContentEntryPixmapAlphaBlend(pos = (5, 50), size = (510, 2), png = 5), # index 4 is the div pixmap
],
"fonts": [gFont("Regular", 22),gFont("Regular", 14)],
"itemHeight": 52
Expand Down
2 changes: 1 addition & 1 deletion lib/python/Plugins/SystemPlugins/WirelessLan/plugin.py
Expand Up @@ -192,7 +192,7 @@ class WlanScan(Screen):
MultiContentEntryText(pos = (175, 30), size = (175, 20), font=1, flags = RT_HALIGN_LEFT, text = 4), # index 0 is the encryption
MultiContentEntryText(pos = (350, 0), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 2), # index 0 is the signal
MultiContentEntryText(pos = (350, 30), size = (200, 20), font=1, flags = RT_HALIGN_LEFT, text = 3), # index 0 is the maxrate
MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (550, 2), png = 6), # index 6 is the div pixmap
MultiContentEntryPixmapAlphaBlend(pos = (0, 52), size = (550, 2), png = 6), # index 6 is the div pixmap
],
"fonts": [gFont("Regular", 28),gFont("Regular", 18)],
"itemHeight": 54
Expand Down
2 changes: 1 addition & 1 deletion lib/python/Screens/InputDeviceSetup.py
Expand Up @@ -26,7 +26,7 @@ class InputDeviceSelection(Screen, HelpableScreen):
<convert type="TemplatedMultiContent">
<!-- device, description, devicepng, divpng -->
{"template": [
MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 2), # index 3 is the interface pixmap
MultiContentEntryPixmapAlphaBlend(pos = (2, 8), size = (54, 54), png = 2), # index 3 is the interface pixmap
MultiContentEntryText(pos = (65, 6), size = (450, 54), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER|RT_WRAP, text = 1), # index 1 is the interfacename
],
"fonts": [gFont("Regular", 28),gFont("Regular", 20)],
Expand Down
22 changes: 11 additions & 11 deletions lib/python/Screens/VirtualKeyBoard.py
Expand Up @@ -8,7 +8,7 @@
from Components.Label import Label
from Components.Language import language
from Components.MenuList import MenuList
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaBlend
from Components.Sources.StaticText import StaticText
from Screens.ChoiceBox import ChoiceBox
from Screens.HelpMenu import HelpableScreen
Expand Down Expand Up @@ -919,26 +919,26 @@ def virtualKeyBoardEntryComponent(self, keys):
x += self.width * width
else:
w = self.bg_l.size().width()
res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(w, self.height), png=self.bg_l))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(w, self.height), png=self.bg_l))
x += w
w = self.bg_m.size().width() + (self.width * (width - 1))
res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(w, self.height), png=self.bg_m, flags=BT_SCALE))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(w, self.height), png=self.bg_m, flags=BT_SCALE))
x += w
w = self.bg_r.size().width()
res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(w, self.height), png=self.bg_r))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(w, self.height), png=self.bg_r))
x += w
highlight = self.keyHighlights.get(key.upper(), (None, None, None)) # Check if the cell needs to be highlighted.
if highlight[0] is None or highlight[1] is None or highlight[2] is None: # If available display the cell highlight.
xHighlight += self.width * width
else:
w = highlight[0].size().width()
res.append(MultiContentEntryPixmapAlphaTest(pos=(xHighlight, 0), size=(w, self.height), png=highlight[0]))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(xHighlight, 0), size=(w, self.height), png=highlight[0]))
xHighlight += w
w = highlight[1].size().width() + (self.width * (width - 1))
res.append(MultiContentEntryPixmapAlphaTest(pos=(xHighlight, 0), size=(w, self.height), png=highlight[1], flags=BT_SCALE))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(xHighlight, 0), size=(w, self.height), png=highlight[1], flags=BT_SCALE))
xHighlight += w
w = highlight[2].size().width()
res.append(MultiContentEntryPixmapAlphaTest(pos=(xHighlight, 0), size=(w, self.height), png=highlight[2]))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(xHighlight, 0), size=(w, self.height), png=highlight[2]))
xHighlight += w
if self.alignment[0] == 1: # Determine the cell alignment.
alignH = RT_HALIGN_LEFT
Expand Down Expand Up @@ -975,7 +975,7 @@ def virtualKeyBoardEntryComponent(self, keys):
top += (h - hImage) // 2
elif alignV == RT_VALIGN_BOTTOM:
top += h - hImage
res.append(MultiContentEntryPixmapAlphaTest(pos=(left, top), size=(wImage, hImage), png=image))
res.append(MultiContentEntryPixmapAlphaBlend(pos=(left, top), size=(wImage, hImage), png=image))
# print("[VirtualKeyBoard] DEBUG: Left=%d, Top=%d, Width=%d, Height=%d, Image Width=%d, Image Height=%d" % (left, top, w, h, wImage, hImage))
else: # Display the cell text.
if len(key) > 1: # NOTE: UTF8 / Unicode glyphs only count as one character here.
Expand All @@ -996,13 +996,13 @@ def markSelectedKey(self):
start, width = self.findStartAndWidth(self.selectedKey)
x = start * self.width
w = self.sel_l.size().width()
self.list[self.selectedKey // self.keyboardWidth].append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(w, self.height), png=self.sel_l))
self.list[self.selectedKey // self.keyboardWidth].append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(w, self.height), png=self.sel_l))
x += w
w = self.sel_m.size().width() + (self.width * (width - 1))
self.list[self.selectedKey // self.keyboardWidth].append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(w, self.height), png=self.sel_m, flags=BT_SCALE))
self.list[self.selectedKey // self.keyboardWidth].append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(w, self.height), png=self.sel_m, flags=BT_SCALE))
x += w
w = self.sel_r.size().width()
self.list[self.selectedKey // self.keyboardWidth].append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(w, self.height), png=self.sel_r))
self.list[self.selectedKey // self.keyboardWidth].append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(w, self.height), png=self.sel_r))
self.previousSelectedKey = self.selectedKey
self["list"].setList(self.list)

Expand Down
2 changes: 2 additions & 0 deletions lib/python/skin.py
Expand Up @@ -502,6 +502,8 @@ def itemHeight(self, value):
self.guiObject.setItemHeight(parseScale(value))

def pixmap(self, value):
if value.endswith(".svg"): # if graphic is svg force alphatest to "blend"
self.guiObject.setAlphatest(2)
self.guiObject.setPixmap(loadPixmap(value, self.desktop, self.guiObject.size().width(), self.guiObject.size().height()))

def backgroundPixmap(self, value):
Expand Down

6 comments on commit c9e5b5a

@IanSav
Copy link
Contributor

@IanSav IanSav commented on c9e5b5a May 12, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this being done?

It comes with a performance hit with not much gain. http://www.bluevoid.com/opengl/sig00/advanced00/notes/node73.html

@WanWizard
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the discussion in the forum.

@IanSav
Copy link
Contributor

@IanSav IanSav commented on c9e5b5a May 12, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment files on the forum.

The new SVG images could be improved to eliminate the need for blending.

@nautilus7
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't tell about performance, but icons (png or svg) with (semi-)transparent background look terrible without it.

@Huevos
Copy link
Contributor Author

@Huevos Huevos commented on c9e5b5a May 12, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't tell about performance, but icons (png or svg) with (semi-)transparent background look terrible without it.

Yes, exactly. AlphaTest is for single channel alpha, not variable alpha. And not just SVG, it is also a huge improvement for PNG graphics.

@Huevos
Copy link
Contributor Author

@Huevos Huevos commented on c9e5b5a May 12, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this being done?

It comes with a performance hit with not much gain. http://www.bluevoid.com/opengl/sig00/advanced00/notes/node73.html

@IanSav, that link is over 20 years old. Please be realistic.

And it also says: disadvantage of alpha testing is that the edges will not be blended into the scene so the edges will not be properly antialiased.

Please sign in to comment.