Open GoogleCodeExporter opened 8 years ago
1/ Even if the Game Gear screen size is 160x144, the video resolution is still
256x192 with colored borders surrounding the screen. It looks good on Game Gear
because it has the same video output and resolution as the Master System and it
was perfectly possible to connect the console to a TV to get the same result.
But try to upscale the GG screen and set it to use original mode, it looks
awful.
2/ Gameboy resolution is not the same at all, it is 160x144 with square pixels
(where as SMS/GG had non-square pixels), which is not compatible with any TV
standard, hence why it need to be adjusted for a TV screen. Putting original
mode support would be possible but totally inaccurate and would not bring any
benefits imo, just "scanlines" to make the screen sharper but that's not how
gameboy games were designed to be displayed anyway. On the contrary, LCD
filtering would probably be the thing to implement.
Original comment by ekeeke31@gmail.com
on 20 Jul 2010 at 4:01
Oh, I see...thanks for clarifying. I was used to play Gameboy on TV using
320x240, with no upscaling, just with the picture centered at the screen and it
looked great. But since Wii is not really capable of displaying a lower
horizontal resolution, it should be hard to adjust the screen at 240p.
What about Super Gameboy? I know gnuboy don't support it. But isn't possible to
display the picture like this? http://bmf.rustedlogic.net/misc/zeldadx.png
I know that Super Gameboy add borders even in games that were not optimized to
use this device.
Original comment by thiagoalvesdealmeida@gmail.com
on 20 Jul 2010 at 6:11
Maybe yes, I think this already displayed like this (in scaled , non-stretched
mode at least), with additional filtering of the Wii 480i rendering. Borders
are rendered by Super Nintendo hardware. I leave this opened since it can
easily be added, I'm not really interested enough in working on this emulator
anymore though.
Original comment by ekeeke31@gmail.com
on 21 Jul 2010 at 6:31
It's good to know it's possible. Thanks for leave this open. Maybe it could
inspire someone.
Original comment by thiagoalvesdealmeida@gmail.com
on 21 Jul 2010 at 3:20
By the way, I don't think Super Gameboy emulation is really necessary just to
have borders. It's possible to just add black borders, like Visual Boy Advance
does.
VBA-M with borders turned on can also reproduce colored borders surrounding the
screen, like Gamegear.
This is how a sample of VBA source code looks like:
gbBorderOn = 0; // GB borders always off
if(gbBorderOn)
{
srcWidth = 256;
srcHeight = 224;
gbBorderLineSkip = 256;
gbBorderColumnSkip = 48;
gbBorderRowSkip = 40;
}
else
{
srcWidth = 160;
srcHeight = 144;
gbBorderLineSkip = 160;
gbBorderColumnSkip = 0;
gbBorderRowSkip = 0;
}
Original comment by thiagoalvesdealmeida@gmail.com
on 21 Jul 2010 at 6:05
VBA code is no help for that, those are 2 different emulators, those settings
makes absolutely no sense for gnuboy ;-)
Anyway, setting black borders is VERY easy and it's already done if you choose
Aspect = SCALED or Aspect=ORIGINAL. SCALED is just a zoomed version of the
original 160x144 picture but still with borders around the screen.
Setting colored borders is more tricky but still possible using GX. Contrary to
Game Gear or Master System though, I don't think the border color is original
part of GBC video emulation, at least it's not emulated by gnuboy.
Original comment by ekeeke31@gmail.com
on 22 Jul 2010 at 8:25
Yes. I know. I was just trying to show how VBA use the extra resolution of the
SNES to create borders.
I can also see that gnuboy already have black borders (scale factor 1x). I was
just wondering how this could be done using 240p instead of 480i. Using a scale
factor of 1x on 640x480 (interlaced mode) is not the same as using it on
640x240 (progressive mode). The picture in this last case would squashed.
I remember that sometime ago FCEUltraGX was using a wrong horizontal
resolution, producing scaling artifacts. This could be solved reducing the
horizontal zoom to 80% (so, do the math 320*0.8=256 or 640*0.8=512), creating
black borders, but solving the problem.
Maybe the same could be done with Gameboy, since the horizontal resolution
(160) is 50% of 320. And the vertical resolution (144) is 60% of 144.
You know better how all this works.
About colored borders on Gameboy, I didn't liked it. Old GB games just use a
white border, and GBC games use all kind of odd color choices. A black border
looks much better.
Original comment by thiagoalvesdealmeida@gmail.com
on 22 Jul 2010 at 3:29
I mean, the vertical resolution of Gameboy (144) is 60% of 240.
Original comment by thiagoalvesdealmeida@gmail.com
on 22 Jul 2010 at 6:05
This is not the same here and not required:
- original aspect is already doing raw 2x upscale, outputs a 320x288 image
centered on screen, without any filtering or artefacts. This is the best you
can get.
- scaled aspect tries to fit the screen vertically while keeping the original
aspect ratio of gameboy (~1:1 screen), this outputs a 500x448 image with
horizontal black borders on both side. Filtering is required so you don't have
artefact because of horizontal AND vertical upscaling.
- stretched aspect fills the whole 4:3 TV screen, this outputs a 640x448 image
which does not respect the original gameboy aspect ratio but make some people
happy because there are no borders. Like the above option, filtering is
required because of odd upscaling.
And for the record (even if it's quite off-topic), FCEUGX was NOT using the
wrong resolution: you don't seem to understand that the notion of "pixels" or
"resolution" is completely dependent on the systems when speaking about analog
video signals. For example, 256 NES pixels have quite the same aspect as 640
Wii pixels when displayed on TV, hence why the rendered image need to be
upscaled . By using 80% scale value, you basically disabled upscaling (the 256
'NES' emulated pixels are simply doubled), it may looks better (because
hardware filtering is switched off in this case) but it's definitively not
accurate (NES consoles never displayed such black borders on the sides off TV
screen).
Now, regarding non-interlaced mode support (240p), which is what your issue is
related to, this can easily be added like in any other emulators (it's just a
matter of configuring the Wii video hardware and reduce vertical scaling, not
complicate percentage caclculation like you are doing is required), it
generally outputs a sharper image but the gameboy LCD screen was not like that
anyway.
Original comment by ekeeke31@gmail.com
on 24 Jul 2010 at 1:54
I confess that all I know about video resolutions comes from the PC
environment, reprogramming a video card to produce very low resolutions
(including 256x240), using a software called soft15khz.
If you have, for example, a NES game, you can achieve a "pixel-perfect" display
on Windows XP running at the actual native resolution (256x240 - unstretched)
or 512x240 (upscaled - maybe a bit narrower, but a lossless duplicate). Wii can
also reproduce the exact same picture (I did compare - same TV and cables), but
using a different horizontal resolution (720 - from what you told me). I have a
hard time understanding how this is possible, but I will try. Let's see...
1 - Wii can output a resolution using a different way compared to a PC running
Windows, right? If I select 720x240 on Windows, it would display 720 active
pixels per line horizontally, and 240 active pixels per line vertically – no
other choice. But when you display 720x240 using Wii's hardware, you can use
720 horizontal pixels to show stuff or change the number of active pixels on
the fly, so, if you want to display a Genesis game, you will program the
emulator to use 640 active pixels centered on a 720 resolution (with 80 black
pixels on the surrounding area). You can't normally do that on a PC using
Windows. Is that all correct?
2 – If Wii is using 720x480, but with 640 active pixels, it would be just
like a PC displaying 640x480 for all purposes, right? I mean, if I want to
stretch a picture to fullscreen, it will be stretch to 640 (and not 720),
right? So, the others 80 pixels are basically "dead".
3 – There is an option on FCEUGX and SNES9XGX called "zoom". The real
function of this option is to change the number of active pixels?
About FCEUGX using or not the wrong resolution, before a recent change, it was
using 640 instead of 512. If you use 640 upscaled without filtering you will
introduce artifacts to the graphics presentation, some pixels will be displayed
twice, when you scroll such an image, you will introduce shivering, pixels will
start to alternate between their 1 and 2-pixel stretched variations. You can
only hide this using a filter (blurring the picture - a quality degrading
solution). I told you that by using 80% scale value you could fix that without
the need to use a filter, but I know it's not accurate since it would display
black borders. Anyway, this problem is now fixed, since FCEUGX is now using
512. That gives me another question…
4 – If you define 512 active pixels on Wii, why you can't see visible black
pixels? 640 active pixels I can understand, but why not with 512? That's
because horizontal scaling always happens in video hardware if the horizontal
resolution is less than 720?
5 – Are there two kinds of upscaling on Wii? One using the GPU, the other
using the video encoder chip. You can disable only the GPU upscale, right?
Original comment by thiagoalvesdealmeida@gmail.com
on 25 Jul 2010 at 5:04
1. Don't know much about PC video cards, but I'm pretty sure you can also use a
720 pixels wide framebuffer on Windows and only fill a limited range in the
middle. This is exactly the same thing on Wii except you only need a
framebuffer as wide as your defined active screen area and video hardware will
take care of the borders. The Wii always output a 720 pixels wide video signal:
within that range, you can define your active screen area and the content of
the framebuffer will be displayed there. Anything else outside will be
displayed black, there is nothing complicated or special with that.
2. This question does not make much sense. There are no definition of
"fullscreen stretch", this depends on TV. Pixels are not 'dead', there are
here, only hidden by TV edges. We used 640 pixels wide active screen because
this is approximately what most TV can show without overscan. Modern TV shows
more which would result in tiny vertical bars, hence why the usual active
screen is generally set a little larger than 640 pixels. And to answer your
question, no it will be different because pixels have different shape depending
on the original resolution. Think the video signal as a continous line with a
FIXED length: this line can hold a certain amount of information ("pixels"),
the number of distinct pixels depends on pixel clock of the hardware that
generated the video signal, which give the resolution. The less pixels you have
on a line, the wider they appear on screen. Again, Wii always output 720 pixels
(incl. black pixels) so they have a specific and constant shape.
3. No, this option is to let you change the amount of scaling between the
original image generated by the emulator (a 256 pixels wide texture) and the
final image rendered by GX hardware into the framebuffer. The active screen
width is generally fixed (at least in NES/SNES emus). However, you can change
how GX will scale the original image up to the framebuffer width. If the
original image is not upscaled completely (80% for example), GX will render
black pixels around the image.
4. Probably because 512 is the width of the framebuffer and the active video
width is still 640 (or a little more). In that case, horizontal scaling does
not happen in GX (well, it only "doubles" the 256 pixels wide image to fill the
framebuffer) but in the video hardware. Indeed, if the framebuffer width is
smaller than the defined active width, video hardware will upscale the image
horizontally up to the active width. This method introduces generally less
filtering than GX scaling and also don't show any scaling artefacts.
5. Answered above. Using GPU (GX), you define the width of your framebuffer and
you can scale any image as you want (anything below the framebuffer width will
render black pixels around the image and anything above will not be rendered).
The video hardware uses the content of this framebuffer to fill the active
video area you defined: the framebuffer width MUST be equal or less than the
active video width. If it is less then horizontal scaling occurs. So basically,
it's up to the developper to define both framebuffer and video width.
Original comment by ekeeke31@gmail.com
on 26 Jul 2010 at 10:27
OK. I'm starting to understand...
You have the horizontal resolution fixed at 720. But some pixels are hidden by
TV overscan (SDTV, since Wii was mostly designed to work with it). So,
practically, 640 is what you really see on the TV, and that's why most games
(and homebrew) use 640 active pixels.
A few more questions:
1. Does the emulator render the screen into a textured and pre-transformed quad
so you can position it and scale it in any way you want?
2. With SMS-Plus (256x192), for example, you just doubles the horizontal
resolution (256 to 512) and leave the vertical resolution untouched? In that
case, the video hardware will upscale the horizontal resolution (512) to the
defined active width (640, I guess). But what about the vertical resolution
(192), it will be also upscaled by the video hardware to 240?
Original comment by thiagoalvesdealmeida@gmail.com
on 27 Jul 2010 at 2:51
1. yes, exactly
2. in non-interlaced (original) mode, the height is left untouched while in
interlaced mode, it is doubled. vertical upscaling can only be done within the
GPU rendering or during the copy from GPU to the framebuffer, if you configured
it. Video hardware does not upscale the framebuffer vertically, it can only
upscale horizontally, so the framebuffer height must be properly configured.
Original comment by ekeeke31@gmail.com
on 27 Jul 2010 at 6:21
Really really thank you for answering all those questions.
I still think that there is no better way of display low-resolution 2D graphics
than using 240p on a CRT SDTV with component cables. Even old PC games,
designed to be played on a PC monitor, looks much better on TV. Maybe it's hard
for you to see the difference since your are probably using a progressive
display, but I think there is no contest between using an interlaced and
non-interlaced mode when dealing with emulators. Of course that when using the
original mode with Gameboy you probably have to disable (vertical) scaling, but
I think that's the point.
About how gameboy games were designed to be displayed, I think it's very
subjective. 2D graphics looks equally good when displayed non-scaled on a LCD
screen and TV. Well, most GBA games have vibrant colors to compensate for all
those people using GBA's without backlight, but that can be corrected changing
your TV settings.
And since most SNES games don't really take in account the "analog stretch"
that happens when you display 256x224 on a 4:3 TV, it makes you really wonder
if Gameboy games were really designed with it's particular aspect ratio and LCD
screen in mind.
Anyway, thanks for leaving this issue open. It's good to know it's possible and
easy, so it could happen in the future. This can wait.
Original comment by thiagoalvesdealmeida@gmail.com
on 28 Jul 2010 at 2:20
Original issue reported on code.google.com by
thiagoalvesdealmeida@gmail.com
on 20 Jul 2010 at 2:56