Drawing single pixels (pixelart) in Image Paint Mode is impossible #71403

Open
opened 2019-11-07 11:45:45 +01:00 by gobb_blend · 49 comments

System Information
Operating system: Windows-10-10.0.17763 64 Bits
Graphics card: GeForce GTX 1070/PCIe/SSE2 NVIDIA Corporation 4.5.0 NVIDIA 430.86

Blender Version
Broken: version: 2.81 (sub 16), branch: master, commit date: 2019-11-06 20:48, hash: 85637311c2
Worked: (optional)

Short description of error
Drawing pixel art in Blender (i.e. unsmoothed single pixels) has become impossible ever since the sub-pixel precision update for the image paint brush.
The ["Option to turn off anti-aliasing" ]] commit and [ https:*developer.blender.org/rBa58c1d4497db73b2480bcc31dec0aa1ca98a3880 | "Fix 2D paint antialiasing offset" commit did not fix this.
@PabloDobarro
You're going to want to have a look at this.

Exact steps for others to reproduce the error
Create a texture of any size. Turn off anti-aliasing in the Brush settings and paint with a brush radius of 1. Neither is it possible to draw single pixels, nor can you draw lines with a width of 1 pixel.
Using the "Constant" falloff preset, the result is this:
image.png
Any of the other non-constant falloffs will produce anti-aliased pixels despite anti-aliasing being turned off:
image.png
This is the expected result you should be getting, regardless of the falloff curve:
image.png

Note
Also, apart from this bug, I believe the Falloff options should vanish from the menus completely when brush anti-aliasing is turned off, since they no longer have a purpose. The falloff must always be that of the "Constant" preset.

**System Information** Operating system: Windows-10-10.0.17763 64 Bits Graphics card: GeForce GTX 1070/PCIe/SSE2 NVIDIA Corporation 4.5.0 NVIDIA 430.86 **Blender Version** Broken: version: 2.81 (sub 16), branch: master, commit date: 2019-11-06 20:48, hash: `85637311c2` Worked: (optional) **Short description of error** Drawing pixel art in Blender (i.e. unsmoothed single pixels) has become impossible ever since the sub-pixel precision update for the image paint brush. The ["Option to turn off anti-aliasing" ]] commit and [[ https:*developer.blender.org/rBa58c1d4497db73b2480bcc31dec0aa1ca98a3880 | "Fix 2D paint antialiasing offset" ](https:*developer.blender.org/rBcd827194f7cc771e9947d474ba0e7c4ae2a2aa9a) commit did not fix this. @PabloDobarro You're going to want to have a look at this. **Exact steps for others to reproduce the error** Create a texture of any size. Turn off anti-aliasing in the Brush settings and paint with a brush radius of 1. Neither is it possible to draw single pixels, nor can you draw lines with a width of 1 pixel. Using the "Constant" falloff preset, the result is this: ![image.png](https://archive.blender.org/developer/F7972929/image.png) Any of the other non-constant falloffs will produce anti-aliased pixels despite anti-aliasing being turned off: ![image.png](https://archive.blender.org/developer/F7972933/image.png) This is the expected result you should be getting, regardless of the falloff curve: ![image.png](https://archive.blender.org/developer/F7972937/image.png) **Note** Also, apart from this bug, I believe the Falloff options should vanish from the menus completely when brush anti-aliasing is turned off, since they no longer have a purpose. The falloff must always be that of the "Constant" preset.
Author

Added subscribers: @PabloDobarro, @gobb_blend

Added subscribers: @PabloDobarro, @gobb_blend

#81693 was marked as duplicate of this issue

#81693 was marked as duplicate of this issue
Member

Added subscriber: @lichtwerk

Added subscriber: @lichtwerk
Member

Can confirm this has changed and single pixel drawing is not possible atm.

Can confirm this has changed and single pixel drawing is not possible atm.
Member

Added subscriber: @Mets

Added subscriber: @Mets
Member

I think that the AA and mask generation code is correct. The brush is filling with 100% strength all pixels which center (1 AA sample per pixel) is inside the brush radius.
2019-11-07 17-20-05.mp4
The problem is that with a 1px radius, you get 2px diameter, so you are always going to paint 2px at the same time. This was not noticeable in the previous mask generation implementation because it was clamped by a 1x1 mask size. To solve this properly, we just need to support values smaller than 1px in the UI, the rest of the texture paint code (at least 2D paint) already supports it (if you enable pressure sensitivity in the radius it will paint with radius smaller than 1px and it works).

If we do a huge hack like P1154, it will work as expected, but this needs to be fixed at a UI level.
2019-11-07 17-29-08.mp4

I just checked the code and the brush size is an int, so it will require some refactoring.

I think that the AA and mask generation code is correct. The brush is filling with 100% strength all pixels which center (1 AA sample per pixel) is inside the brush radius. [2019-11-07 17-20-05.mp4](https://archive.blender.org/developer/F7976213/2019-11-07_17-20-05.mp4) The problem is that with a 1px radius, you get 2px diameter, so you are always going to paint 2px at the same time. This was not noticeable in the previous mask generation implementation because it was clamped by a 1x1 mask size. To solve this properly, we just need to support values smaller than 1px in the UI, the rest of the texture paint code (at least 2D paint) already supports it (if you enable pressure sensitivity in the radius it will paint with radius smaller than 1px and it works). If we do a huge hack like [P1154](https://archive.blender.org/developer/P1154.txt), it will work as expected, but this needs to be fixed at a UI level. [2019-11-07 17-29-08.mp4](https://archive.blender.org/developer/F7976276/2019-11-07_17-29-08.mp4) I just checked the code and the brush size is an int, so it will require some refactoring.
Author

I guess being able to set the Radius to a minimum value of 0.5 would be an okay solution for now.

Too bad this won't be finished in time for 2.81. Some artists won't have a stable version to work with for a couple of months then if you go the serious refactoring route (which I agree you eventually should).

One more thing:
What's weird about this is that every drawing software with the exception of Blender defines brush size by diameter (usually called "Size" for simplicity). Artists are always going to expect to be able to draw single pixels after inputting a "1" into the corresponding UI field.
I don't assume that this is ever going to change, and Blender is ever going to define brush size by diameter instead of radius...

I guess being able to set the Radius to a minimum value of 0.5 would be an okay solution for now. Too bad this won't be finished in time for 2.81. Some artists won't have a stable version to work with for a couple of months then if you go the serious refactoring route (which I agree you eventually should). One more thing: What's weird about this is that every drawing software with the exception of Blender defines brush size by diameter (usually called "Size" for simplicity). Artists are always going to expect to be able to draw single pixels after inputting a "1" into the corresponding UI field. I don't assume that this is ever going to change, and Blender is ever going to define brush size by diameter instead of radius...
Member

Changed status from 'Confirmed' to: 'Archived'

Changed status from 'Confirmed' to: 'Archived'
Pablo Dobarro self-assigned this 2019-12-24 00:58:00 +01:00
Member

The current implementation is correct. A 1px radius is 2px diameter, so it paints two pixels at the same time.
I know that this makes impossible to paint pixel art. That is properly fixed in D6209, but I still need to check that patch again to see if it breaks things in some other paint modes, as it is quite a big change that may affect some areas that I'm not aware of.

The current implementation is correct. A 1px radius is 2px diameter, so it paints two pixels at the same time. I know that this makes impossible to paint pixel art. That is properly fixed in [D6209](https://archive.blender.org/developer/D6209), but I still need to check that patch again to see if it breaks things in some other paint modes, as it is quite a big change that may affect some areas that I'm not aware of.

Added subscriber: @alfredbaudisch

Added subscriber: @alfredbaudisch

Added subscriber: @PeterHIndes

Added subscriber: @PeterHIndes

yes the 1px radius is a pain. maybe defining it in terms of diameter would fix this without needing a float. The values could be converted behind the scenes or just shown as diameter. We could also just get a pencil tool like some other programs have. Or maybe just a default brush setup as a pencil.

yes the 1px radius is a pain. maybe defining it in terms of diameter would fix this without needing a float. The values could be converted behind the scenes or just shown as diameter. We could also just get a pencil tool like some other programs have. Or maybe just a default brush setup as a pencil.

Added subscriber: @officeqube

Added subscriber: @officeqube

Added subscriber: @TheZakMan

Added subscriber: @TheZakMan

Did this get solved?
Will we be able to paint 1px again?
And why not use size like all other artistc programs out there insted of diameter?

Did this get solved? Will we be able to paint 1px again? And why not use size like all other artistc programs out there insted of diameter?

Size is diameter. No confusion intended.

Size is diameter. No confusion intended.

I was hoping that 2.83 would fix the 1px problem for us that love to paint pixel textures :(

super_sad_no_1px.png

I was hoping that 2.83 would fix the **1px** problem for us that love to paint pixel textures :( ![super_sad_no_1px.png](https://archive.blender.org/developer/F8575765/super_sad_no_1px.png)
Member

Changed status from 'Archived' to: 'Needs Triage'

Changed status from 'Archived' to: 'Needs Triage'
Member

Added subscriber: @dfelinto

Added subscriber: @dfelinto
Member

I guess if this wasn't resolved like it was expected, at the very least it should be re-opened so a developer can comment again. Messaging was also a bit confusing to me, with "it's working as expected" and "it will be fixed" in the same comment. To me this also seems like a regression, so shouldn't it be a high priority issue?

CC @PabloDobarro @dfelinto

I guess if this wasn't resolved like it was expected, at the very least it should be re-opened so a developer can comment again. Messaging was also a bit confusing to me, with "it's working as expected" and "it will be fixed" in the same comment. To me this also seems like a regression, so shouldn't it be a high priority issue? CC @PabloDobarro @dfelinto

Added subscriber: @mano-wii

Added subscriber: @mano-wii

Changed status from 'Needs Triage' to: 'Confirmed'

Changed status from 'Needs Triage' to: 'Confirmed'

From what I can see in the comments, this was closed because it works as intended.
Apparently the smallest possible brush diameter is currently 2px (1px radius).
D6209 seems to be a proposal to resolve this limitation.

From what I can see in the comments, this was closed because it works as intended. Apparently the smallest possible brush diameter is currently 2px (1px radius). [D6209](https://archive.blender.org/developer/D6209) seems to be a proposal to resolve this limitation.
Member

Added subscribers: @JanKaderabek, @TheRedWaxPolice

Added subscribers: @JanKaderabek, @TheRedWaxPolice

Any news on this?

Any news on this?

In #71403#837239, @PabloDobarro wrote:
The current implementation is correct. A 1px radius is 2px diameter, so it paints two pixels at the same time.

But why 2.79 is drawing 1 pixel with 1px radius brush then?

Our team is currently working on a complex game exporter / importer integrated into Blender and we need to let user to paint single pixels on 16x16px image to create a physics maps, so this is an absolutely critical feature for us.
We didn't expect such simple task to be problem for Blender, is there any chance the fix D6209 can make it to the official build?
Thank you!

> In #71403#837239, @PabloDobarro wrote: > The current implementation is correct. A 1px radius is 2px diameter, so it paints two pixels at the same time. But why 2.79 is drawing 1 pixel with 1px radius brush then? Our team is currently working on a complex game exporter / importer integrated into Blender and we need to let user to paint single pixels on 16x16px image to create a physics maps, so this is an absolutely critical feature for us. We didn't expect such simple task to be problem for Blender, is there any chance the fix [D6209](https://archive.blender.org/developer/D6209) can make it to the official build? Thank you!
Author

I'm also dying to see this get fixed. I am thinking about this literally every single day at work.
Had to put two game projects completely on hold because of this issue caused by Pablo Dobarro's subpixel drawing feature.

Regarding the fix, instead of the brush radius becoming a float all over Blender, just so we can have a 0.5 pixel brush, I would very much prefer if we'd measure the brush in diameter like every other graphics software out there.
No artist wants to do math when choosing a brush size. 1 in the UI means "one pixel". Not two. Not a 2x2 square.

I'm also dying to see this get fixed. I am thinking about this literally every single day at work. Had to put two game projects completely on hold because of this issue caused by Pablo Dobarro's subpixel drawing feature. Regarding the fix, instead of the brush radius becoming a float all over Blender, just so we can have a 0.5 pixel brush, I would very much prefer if we'd measure the brush in diameter like every other graphics software out there. No artist wants to do math when choosing a brush size. 1 in the UI means "one pixel". Not two. Not a 2x2 square.

Added subscriber: @Teds

Added subscriber: @Teds
Author

Hey developers. I know there's no point in telling you this, because you're busy enough as it is, and there's already a schedule for everything -- but several months have now passed, and I feel compelled to remind you that this is not a minor issue, and there are people out there literally counting the days until you resolve it.
Fingers crossed for Blender 3.0. Blender should be the go-to software for all things low poly / PSX style. Please allow pixel artists to finally make the switch from 18-months-old Blender 2.80 to the latest release. That would be great. Best of luck.

Hey developers. I know there's no point in telling you this, because you're busy enough as it is, and there's already a schedule for everything -- but several months have now passed, and I feel compelled to remind you that this is not a minor issue, and there are people out there literally counting the days until you resolve it. Fingers crossed for **Blender 3.0**. Blender should be **the** go-to software for all things low poly / PSX style. Please allow pixel artists to finally make the switch from 18-months-old Blender 2.80 to the latest release. That would be great. Best of luck.

Added subscriber: @Ortho_Cam

Added subscriber: @Ortho_Cam

For anyone waiting, couldn't you get by painting at 2x2 pixels and scaling down by half when done? https://youtu.be/RQVAUaSUP-k?t=1075 might help too.

For anyone waiting, couldn't you get by painting at 2x2 pixels and scaling down by half when done? https://youtu.be/RQVAUaSUP-k?t=1075 might help too.
Author

@Ortho_Cam
No, drawing at a radius of 1 with constant falloff and no anti-aliasing will leave you with dots that look like this:
grafik.png There's no way to predict what this will look like when scaled down. And why even go through all this hassle when the best option is still to simply use Blender 2.80?
On top of that, drawing is insanely laggy in Blender 2.91 for some reason. It must be some kind of regression. I didn't look into it.
So, it's currently either back to 2.80 (like the person in your video), or no pixel-perfect painting at all.

Until "radius" is finally changed to the much more usable "size" AKA diameter (in pixels), as it is in virtually any other professional application. (Photoshop, Krita, ClipStudioPaint, SubstancePainter, zBrush, Mudbox, the list goes on.)

@Ortho_Cam No, drawing at a radius of 1 with constant falloff and no anti-aliasing will leave you with dots that look like this: ![grafik.png](https://archive.blender.org/developer/F9577329/grafik.png) There's no way to predict what this will look like when scaled down. And why even go through all this hassle when the best option is still to simply use Blender 2.80? On top of that, drawing is insanely laggy in Blender 2.91 for some reason. It must be some kind of regression. I didn't look into it. So, it's currently either back to 2.80 (like the person in your video), or no pixel-perfect painting at all. Until "radius" is finally changed to the much more usable "size" AKA diameter (in pixels), as it is in virtually any other professional application. (Photoshop, Krita, ClipStudioPaint, SubstancePainter, zBrush, Mudbox, the list goes on.)

Added subscriber: @zNight

Added subscriber: @zNight

Added subscriber: @benhhopkins

Added subscriber: @benhhopkins

Added subscriber: @DoekedeWolf

Added subscriber: @DoekedeWolf

Added subscriber: @Bad.Unit

Added subscriber: @Bad.Unit

Hello, i want to subscribe to this issue because yeah it should definitely need to fix... with 1px radius, no AA, constant falloff brush paint chunks of 2/3/4 pixels, and for pixel art this is not good. Workaround at the moment exists, like addons, downscaling, or use external editors like Krita or Aseprite, but this should be a normal in blender too working on a single pixel, i think this issue don't need to have a low severity even if is not a breaking bug, but should gave more attention to fix in the upcoming releases, thanks dev for all the efforts!

Hello, i want to subscribe to this issue because yeah it should definitely need to fix... with 1px radius, no AA, constant falloff brush paint chunks of 2/3/4 pixels, and for pixel art this is not good. Workaround at the moment exists, like addons, downscaling, or use external editors like Krita or Aseprite, but this should be a normal in blender too working on a single pixel, i think this issue don't need to have a low severity even if is not a breaking bug, but should gave more attention to fix in the upcoming releases, thanks dev for all the efforts!

Added subscriber: @peter_hutsul

Added subscriber: @peter_hutsul
You can find solution here https://blender.stackexchange.com/questions/198544/how-to-texture-paint-individual-pixels

blender-pixel-draw.gif

![blender-pixel-draw.gif](https://archive.blender.org/developer/F9892459/blender-pixel-draw.gif)
Author

In #71403#1129659, @peter_hutsul wrote:
You can find solution here
https://blender.stackexchange.com/questions/198544/how-to-texture-paint-individual-pixels

No, that information is false. It has been addressed already.
With that kind of brush setup, Blender will often not draw a pixel, or draw two/three at once, or draw the pixels slightly less opaque than they should be. There is no sweet spot that acts like an actual pixel perfect brush.

Pablo Dobarro has already acknowledged that turning "radius" into "diameter" for all brushes is the way to go. https://developer.blender.org/D6209#252648
It will likely be worked on in a few months, whenever he's done with sculpt mode.
Until then, it's back to Blender 2.8.

> In #71403#1129659, @peter_hutsul wrote: > You can find solution here > https://blender.stackexchange.com/questions/198544/how-to-texture-paint-individual-pixels No, that information is false. It has been addressed already. With that kind of brush setup, Blender will often not draw a pixel, or draw two/three at once, or draw the pixels slightly less opaque than they should be. There is no sweet spot that acts like an actual pixel perfect brush. Pablo Dobarro has already acknowledged that turning "radius" into "diameter" for all brushes is the way to go. https://developer.blender.org/D6209#252648 It will likely be worked on in a few months, whenever he's done with sculpt mode. Until then, it's back to Blender 2.8.

Added subscriber: @recatek

Added subscriber: @recatek

Added subscriber: @Radivarig

Added subscriber: @Radivarig

Added subscriber: @ziflin

Added subscriber: @ziflin

Would love to be able to do 3D pixel art models directly in more recent versions of Blender, especially with all of the exciting upcoming texture painting improvements (layers, etc.). Currently it's nearly impossible without external tools.

Would love to be able to do 3D pixel art models directly in more recent versions of Blender, especially with all of the exciting upcoming texture painting improvements (layers, etc.). Currently it's nearly impossible without external tools.

Added subscriber: @AndyCuccaro

Added subscriber: @AndyCuccaro

Added subscriber: @jfmatheu

Added subscriber: @jfmatheu
Philipp Oeser removed the
Interest
Sculpt, Paint & Texture
label 2023-02-10 09:12:46 +01:00

I want to show interest in resolving this issue, I'd love to be able to paint pixel art within the recent Blender releases rather than having to go back to 2.79

I want to show interest in resolving this issue, I'd love to be able to paint pixel art within the recent Blender releases rather than having to go back to 2.79

Yeah this would be much appreciated. Here are two related threads with imo very good suggestions to solve this issue thoroughly:
Radius vs. Diameter: #98676
A separate Pixel Brush / Pencil tool: #98607

Yeah this would be much appreciated. Here are two related threads with imo very good suggestions to solve this issue thoroughly: Radius vs. Diameter: https://projects.blender.org/blender/blender/issues/98676 A separate Pixel Brush / Pencil tool: https://projects.blender.org/blender/blender/issues/98607
Sign in to join this conversation.
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overlay
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest
Wayland
Interest
Workbench
Interest: X11
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
EEVEE & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Milestone
No project
No Assignees
25 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: blender/blender#71403
No description provided.