[Bf-committers] Fix for edge rendering when fields are enabled
Ton Roosendaal
bf-committers@blender.org
Fri, 23 Jul 2004 19:30:56 +0200
Hi,
Thanks for the fix proposal... the error is not so much in fields, as
in general with rendering more extreme aspect ratios (not square
pixels).
That's luckily a value available globally in the rendercode.
R.ycor= ( (float)R.r.yasp)/( (float)R.r.xasp);
Using this value by default would solve problems without need to check
for field render, giving a bit nicer code then too.
If you like to check on that, you're welcome of course, otherwise I put
this on my todo (but thats a long list already! :)
-Ton-
On Thursday, Jul 22, 2004, at 11:56 Europe/Amsterdam, Theodore
Schundler wrote:
>
>
> Hello. Based on the "introduction to the Blender source" I should post
> this here. I haven't had a chance to test it outside my systems, but it
> seems to have worked correctly for 500 frames so far. I'm pretty
> certain
> that the changes are simple enough that it should work on any platform
> &
> testing it with a variety my files & animations so far has yeilded good
> results.
>
> Basically if you enable edge rendering and do a field render, because
> each frame is rendered at 1/2 the height, the edge effect is twice as
> thick in Y as it is in X. And it's quite noticeable.
>
> The edge rendering system uses changes in the z buffer value relative
> to
> adjacent pixels to determine if it should draw an edge. In the standard
> render pipe, the edge uses the same zbuffer as the rest of the scene,
> so
> it isn't possible to properly determine what the edge should be - one
> pixel above or below. But in the unified renderer, the edge system
> builds its own zbuffer. So, I altered it so in the case of rendering
> with fields, its own internal zbuffer is the full image height. So the
> edges are rendered properly as if they are part of a full height frame
> because the full zbuffer data is there.
>
> Hopefully that made sense. To test it, make a solid, shadeless square
> in
> front of the camera. Render it with edges. Turning OSA on helps edges a
> lot. It will have a nice edge. Then turn on fields, and you'd see
> clearly the difference in the size of the edges. Apply my path,
> recompile, render the same image with fields on, and you get nice
> edges.
> The improvement is more dramatic in more detailed scenes.
>
> And finally, here's the patch against the current bf-blender:
>
>
> Index: source/blender/render/intern/include/edgeRender.h
> ===================================================================
> RCS file:
> /cvsroot/bf-blender/blender/source/blender/render/intern/include/
> edgeRender.h,v
> retrieving revision 1.5
> diff -r1.5 edgeRender.h
> 57c57,58
> < float b
> ---
>> float b,
>> int fields
> Index: source/blender/render/intern/source/edgeRender.c
> ===================================================================
> RCS file:
> /cvsroot/bf-blender/blender/source/blender/render/intern/source/
> edgeRender.c,v
> retrieving revision 1.6
> diff -r1.6 edgeRender.c
> 104a105,106
>> static int useFields; /* field Rendering mode enabled, so scale
> things*/
>> /* to compute zbuffer for full height
> image */
> 126a129
>>
> 182c185,186
> < float r, float g, float b
> ---
>> float r, float g, float b,
>> int fields
> 186a191
>> useFields = fields;
> 220c225
> < bufHeight = imHeight + (2 * maskBorder);
> ---
>> bufHeight = imHeight * (useFields + 1) + (2 * maskBorder);
> 277c282
> < (y < 0) || (y > (imHeight-1) ) ) {
> ---
>> (y < 0) || (y > (imHeight * (1 + useFields) - 1) ) ) {
> 487,489c492,494
> < rz1+= 2;
> < rz2+= 2;
> < rz3+= 2;
> ---
>> rz1+= 2 + bufWidth * useFields;
>> rz2+= 2 + bufWidth * useFields;
>> rz3+= 2 + bufWidth * useFields;
> 491,493c496,498
> < matptr_low += 2;
> < matptr_cent += 2;
> < matptr_high += 2;
> ---
>> matptr_low += 2 + bufWidth * useFields;
>> matptr_cent += 2 + bufWidth * useFields;
>> matptr_high += 2 + bufWidth * useFields;
> 549c554
> < Zmuly= ((float) imHeight)/2.0;
> ---
>> Zmuly= ((float) imHeight)/(2.0 - (float) useFields);
> 557c562
> < Amaxy = imHeight;
> ---
>> Amaxy = imHeight * (1 + useFields);
> Index: source/blender/render/intern/source/vanillaRenderPipe.c
> ===================================================================
> RCS file:
> /cvsroot/bf-blender/blender/source/blender/render/intern/source/
> vanillaRenderPipe.c,v
> retrieving revision 1.9
> diff -r1.9 vanillaRenderPipe.c
> 245c245,246
> < R.r.edgeR, R.r.edgeG, R.r.edgeB);
> ---Hello. Based on the "introduction to the Blender source" I should
> post this here. I haven't had a chance to test it outside my systems,
> but it seems to have worked correctly for 500 frames so far. I'm pretty
> certain that the changes are simple enough that it should work on any
> platform & testing it with a variety my files & animations so far has
> yeilded good results.
>
> Basically if you enable edge rendering and do a field render, because
> each frame is rendered at 1/2 the height, the edge effect is twice as
> thick in Y as it is in X. And it's quite noticeable.
>
> The edge rendering system uses changes in the z buffer value relative
> to
> adjacent pixels to determine if it should draw an edge. In the standard
> render pipe, the edge uses the same zbuffer as the rest of the scene,
> so
> it isn't possible to properly determine what the edge should be - one
> pixel above or below. But in the unified renderer, the edge system
> builds its own zbuffer. So, I altered it so in the case of rendering
> with fields, its own internal zbuffer is the full image height. So the
> edges are rendered properly as if they are part of a full height frame
> because the full zbuffer data is there.
>
> Hopefully that made sense. To test it, make a solid, shadeless square
> in
> front of the camera. Render it with edges. Turning OSA on helps edges a
> lot. It will have a nice edge. Then turn on fields, and you'd see
> clearly the difference in the size of the edges. Apply my path,
> recompile, render the same image with fields on, and you get nice
> edges.
> The improvement is more dramatic in more detailed scenes.
>
> And finally, here's the patch against the current bf-blender:
>
>
> Index: source/blender/render/intern/include/edgeRender.h
> ===================================================================
> RCS file:
> /cvsroot/bf-blender/blender/source/blender/render/intern/include/
> edgeRender.h,v
> retrieving revision 1.5
> diff -r1.5 edgeRender.h
> 57c57,58
> < float b
> ---
>> float b,
>> int fields
> Index: source/blender/render/intern/source/edgeRender.c
> ===================================================================
> RCS file:
> /cvsroot/bf-blender/blender/source/blender/render/intern/source/
> edgeRender.c,v
> retrieving revision 1.6
> diff -r1.6 edgeRender.c
> 104a105,106
>> static int useFields; /* field Rendering mode enabled, so scale
> things*/
>> /* to compute zbuffer for full height
> image */
> 126a129
>>
> 182c185,186
> < float r, float g, float b
> ---
>> float r, float g, float b,
>> int fields
> 186a191
>> useFields = fields;
> 220c225
> < bufHeight = imHeight + (2 * maskBorder);
> ---
>> bufHeight = imHeight * (useFields + 1) + (2 * maskBorder);
> 277c282
> < (y < 0) || (y > (imHeight-1) ) ) {
> ---
>> (y < 0) || (y > (imHeight * (1 + useFields) - 1) ) ) {
> 487,489c492,494
> < rz1+= 2;
> < rz2+= 2;
> < rz3+= 2;
> ---
>> rz1+= 2 + bufWidth * useFields;
>> rz2+= 2 + bufWidth * useFields;
>> rz3+= 2 + bufWidth * useFields;
> 491,493c496,498
> < matptr_low += 2;
> < matptr_cent += 2;
> < matptr_high += 2;
> ---
>> matptr_low += 2 + bufWidth * useFields;
>> matptr_cent += 2 + bufWidth * useFields;
>> matptr_high += 2 + bufWidth * useFields;
> 549c554
> < Zmuly= ((float) imHeight)/2.0;
> ---
>> Zmuly= ((float) imHeight)/(2.0 - (float) useFields);
> 557c562
> < Amaxy = imHeight;
> ---
>> Amaxy = imHeight * (1 + useFields);
> Index: source/blender/render/intern/source/vanillaRenderPipe.c
> ===================================================================
> RCS file:
> /cvsroot/bf-blender/blender/source/blender/render/intern/source/
> vanillaRenderPipe.c,v
> retrieving revision 1.9
> diff -r1.9 vanillaRenderPipe.c
> 245c245,246
> < R.r.edgeR, R.r.edgeG, R.r.edgeB);
> ---
>> R.r.edgeR, R.r.edgeG, R.r.edgeB,
>> (R.r.mode & R_FIELDS == R_FIELDS));
>
>> R.r.edgeR, R.r.edgeG, R.r.edgeB,
>> (R.r.mode & R_FIELDS == R_FIELDS));
>
>
> This message scanned for viruses and SPAM by GWGuardian at SCU (MGW1)
> _______________________________________________
> Bf-committers mailing list
> Bf-committers@blender.org
> http://www.blender.org/mailman/listinfo/bf-committers
>
>
------------------------------------------------------------------------
--
Ton Roosendaal Blender Foundation ton@blender.org
http://www.blender.org