mirror of
				https://github.com/facebookresearch/pytorch3d.git
				synced 2025-11-04 18:02:14 +08:00 
			
		
		
		
	Fix spelling of "Gouraud"
Summary: Fix spelling of *Gouraud* in [Gouraud shading](https://en.wikipedia.org/wiki/Gouraud_shading). Reviewed By: nikhilaravi Differential Revision: D19943547 fbshipit-source-id: 5c016b7b051a7b33a7b68ed5303b642d9e834bbd
This commit is contained in:
		
							parent
							
								
									f0dc65110a
								
							
						
					
					
						commit
						9ca5489107
					
				@ -91,18 +91,18 @@ Shaders are the most flexible part of the PyTorch3D rendering API. We have creat
 | 
			
		||||
 | 
			
		||||
A shader can incorporate several steps:
 | 
			
		||||
- **texturing** (e.g interpolation of vertex RGB colors or interpolation of vertex UV coordinates followed by sampling from a texture map (interpolation uses barycentric coordinates output from rasterization))
 | 
			
		||||
- **lighting/shading** (e.g. ambient, diffuse, specular lighting, Phong, Gourad, Flat)
 | 
			
		||||
- **lighting/shading** (e.g. ambient, diffuse, specular lighting, Phong, Gouraud, Flat)
 | 
			
		||||
- **blending** (e.g. hard blending using only the closest face for each pixel, or soft blending using a weighted sum of the top K faces per pixel)
 | 
			
		||||
 | 
			
		||||
 We have examples of several combinations of these functions based on the texturing/shading/blending support we have currently. These are summarised in this table below. Many other combinations are possible and we plan to expand the options available for texturing, shading and blending.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
|Example Shaders  | Vertex Textures| Texture Map| Flat Shading| Gourad Shading| Phong Shading | Hard blending | Soft Blending |
 | 
			
		||||
|Example Shaders  | Vertex Textures| Texture Map| Flat Shading| Gouraud Shading| Phong Shading | Hard blending | Soft Blending |
 | 
			
		||||
| ------------- |:-------------:  | :--------------:| :--------------:| :--------------:| :--------------:|:--------------:|:--------------:|
 | 
			
		||||
| HardPhongShader |  :heavy_check_mark: ||||  :heavy_check_mark: |  :heavy_check_mark:||
 | 
			
		||||
| SoftPhongShader |  :heavy_check_mark: ||||  :heavy_check_mark: | | :heavy_check_mark:|
 | 
			
		||||
| HardGouradShader |  :heavy_check_mark: |||  :heavy_check_mark: ||  :heavy_check_mark:||
 | 
			
		||||
| SoftGouradShader |  :heavy_check_mark: |||  :heavy_check_mark: |||  :heavy_check_mark:|
 | 
			
		||||
| HardGouraudShader |  :heavy_check_mark: |||  :heavy_check_mark: ||  :heavy_check_mark:||
 | 
			
		||||
| SoftGouraudShader |  :heavy_check_mark: |||  :heavy_check_mark: |||  :heavy_check_mark:|
 | 
			
		||||
| TexturedSoftPhongShader ||  :heavy_check_mark: |||  :heavy_check_mark: ||  :heavy_check_mark:|
 | 
			
		||||
| HardFlatShader |  :heavy_check_mark: ||  :heavy_check_mark: |||  :heavy_check_mark:||
 | 
			
		||||
| SoftSilhouetteShader |||||||  :heavy_check_mark:|
 | 
			
		||||
 | 
			
		||||
@ -18,16 +18,16 @@ from .lighting import DirectionalLights, PointLights, diffuse, specular
 | 
			
		||||
from .materials import Materials
 | 
			
		||||
from .mesh import (
 | 
			
		||||
    HardFlatShader,
 | 
			
		||||
    HardGouradShader,
 | 
			
		||||
    HardGouraudShader,
 | 
			
		||||
    HardPhongShader,
 | 
			
		||||
    MeshRasterizer,
 | 
			
		||||
    MeshRenderer,
 | 
			
		||||
    RasterizationSettings,
 | 
			
		||||
    SoftGouradShader,
 | 
			
		||||
    SoftGouraudShader,
 | 
			
		||||
    SoftPhongShader,
 | 
			
		||||
    SoftSilhouetteShader,
 | 
			
		||||
    TexturedSoftPhongShader,
 | 
			
		||||
    gourad_shading,
 | 
			
		||||
    gouraud_shading,
 | 
			
		||||
    interpolate_face_attributes,
 | 
			
		||||
    interpolate_texture_map,
 | 
			
		||||
    interpolate_vertex_colors,
 | 
			
		||||
 | 
			
		||||
@ -5,14 +5,14 @@ from .rasterizer import MeshRasterizer, RasterizationSettings
 | 
			
		||||
from .renderer import MeshRenderer
 | 
			
		||||
from .shader import (
 | 
			
		||||
    HardFlatShader,
 | 
			
		||||
    HardGouradShader,
 | 
			
		||||
    HardGouraudShader,
 | 
			
		||||
    HardPhongShader,
 | 
			
		||||
    SoftGouradShader,
 | 
			
		||||
    SoftGouraudShader,
 | 
			
		||||
    SoftPhongShader,
 | 
			
		||||
    SoftSilhouetteShader,
 | 
			
		||||
    TexturedSoftPhongShader,
 | 
			
		||||
)
 | 
			
		||||
from .shading import gourad_shading, phong_shading
 | 
			
		||||
from .shading import gouraud_shading, phong_shading
 | 
			
		||||
from .texturing import (  # isort: skip
 | 
			
		||||
    interpolate_face_attributes,
 | 
			
		||||
    interpolate_texture_map,
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ from ..blending import (
 | 
			
		||||
from ..cameras import OpenGLPerspectiveCameras
 | 
			
		||||
from ..lighting import PointLights
 | 
			
		||||
from ..materials import Materials
 | 
			
		||||
from .shading import flat_shading, gourad_shading, phong_shading
 | 
			
		||||
from .shading import flat_shading, gouraud_shading, phong_shading
 | 
			
		||||
from .texturing import interpolate_texture_map, interpolate_vertex_colors
 | 
			
		||||
 | 
			
		||||
# A Shader should take as input fragments from the output of rasterization
 | 
			
		||||
@ -126,7 +126,7 @@ class SoftPhongShader(nn.Module):
 | 
			
		||||
        return images
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class HardGouradShader(nn.Module):
 | 
			
		||||
class HardGouraudShader(nn.Module):
 | 
			
		||||
    """
 | 
			
		||||
    Per vertex lighting - the lighting model is applied to the vertex colors and
 | 
			
		||||
    the colors are then interpolated using the barycentric coordinates to
 | 
			
		||||
@ -138,7 +138,7 @@ class HardGouradShader(nn.Module):
 | 
			
		||||
 | 
			
		||||
    .. code-block::
 | 
			
		||||
 | 
			
		||||
        shader = HardGouradShader(device=torch.device("cuda:0"))
 | 
			
		||||
        shader = HardGouraudShader(device=torch.device("cuda:0"))
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(self, device="cpu", cameras=None, lights=None, materials=None):
 | 
			
		||||
@ -159,7 +159,7 @@ class HardGouradShader(nn.Module):
 | 
			
		||||
        cameras = kwargs.get("cameras", self.cameras)
 | 
			
		||||
        lights = kwargs.get("lights", self.lights)
 | 
			
		||||
        materials = kwargs.get("materials", self.materials)
 | 
			
		||||
        pixel_colors = gourad_shading(
 | 
			
		||||
        pixel_colors = gouraud_shading(
 | 
			
		||||
            meshes=meshes,
 | 
			
		||||
            fragments=fragments,
 | 
			
		||||
            lights=lights,
 | 
			
		||||
@ -170,7 +170,7 @@ class HardGouradShader(nn.Module):
 | 
			
		||||
        return images
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SoftGouradShader(nn.Module):
 | 
			
		||||
class SoftGouraudShader(nn.Module):
 | 
			
		||||
    """
 | 
			
		||||
    Per vertex lighting - the lighting model is applied to the vertex colors and
 | 
			
		||||
    the colors are then interpolated using the barycentric coordinates to
 | 
			
		||||
@ -182,7 +182,7 @@ class SoftGouradShader(nn.Module):
 | 
			
		||||
 | 
			
		||||
    .. code-block::
 | 
			
		||||
 | 
			
		||||
        shader = SoftGouradShader(device=torch.device("cuda:0"))
 | 
			
		||||
        shader = SoftGouraudShader(device=torch.device("cuda:0"))
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    def __init__(
 | 
			
		||||
@ -213,7 +213,7 @@ class SoftGouradShader(nn.Module):
 | 
			
		||||
        cameras = kwargs.get("cameras", self.cameras)
 | 
			
		||||
        lights = kwargs.get("lights", self.lights)
 | 
			
		||||
        materials = kwargs.get("materials", self.materials)
 | 
			
		||||
        pixel_colors = gourad_shading(
 | 
			
		||||
        pixel_colors = gouraud_shading(
 | 
			
		||||
            meshes=meshes,
 | 
			
		||||
            fragments=fragments,
 | 
			
		||||
            lights=lights,
 | 
			
		||||
 | 
			
		||||
@ -79,7 +79,7 @@ def phong_shading(
 | 
			
		||||
    return colors
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def gourad_shading(
 | 
			
		||||
def gouraud_shading(
 | 
			
		||||
    meshes, fragments, lights, cameras, materials
 | 
			
		||||
) -> torch.Tensor:
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB  | 
| 
		 Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB  | 
@ -25,7 +25,7 @@ from pytorch3d.renderer.mesh.rasterizer import (
 | 
			
		||||
from pytorch3d.renderer.mesh.renderer import MeshRenderer
 | 
			
		||||
from pytorch3d.renderer.mesh.shader import (
 | 
			
		||||
    BlendParams,
 | 
			
		||||
    HardGouradShader,
 | 
			
		||||
    HardGouraudShader,
 | 
			
		||||
    HardPhongShader,
 | 
			
		||||
    SoftSilhouetteShader,
 | 
			
		||||
    TexturedSoftPhongShader,
 | 
			
		||||
@ -51,7 +51,7 @@ def load_rgb_image(filename, data_dir=DATA_DIR):
 | 
			
		||||
class TestRenderingMeshes(unittest.TestCase):
 | 
			
		||||
    def test_simple_sphere(self, elevated_camera=False):
 | 
			
		||||
        """
 | 
			
		||||
        Test output of phong and gourad shading matches a reference image using
 | 
			
		||||
        Test output of phong and gouraud shading matches a reference image using
 | 
			
		||||
        the default values for the light sources.
 | 
			
		||||
 | 
			
		||||
        Args:
 | 
			
		||||
@ -128,12 +128,12 @@ class TestRenderingMeshes(unittest.TestCase):
 | 
			
		||||
        self.assertTrue(torch.allclose(rgb, image_ref_phong_dark, atol=0.05))
 | 
			
		||||
 | 
			
		||||
        ######################################
 | 
			
		||||
        # Change the shader to a GouradShader
 | 
			
		||||
        # Change the shader to a GouraudShader
 | 
			
		||||
        ######################################
 | 
			
		||||
        lights.location = torch.tensor([0.0, 0.0, -2.0], device=device)[None]
 | 
			
		||||
        renderer = MeshRenderer(
 | 
			
		||||
            rasterizer=rasterizer,
 | 
			
		||||
            shader=HardGouradShader(
 | 
			
		||||
            shader=HardGouraudShader(
 | 
			
		||||
                lights=lights, cameras=cameras, materials=materials
 | 
			
		||||
            ),
 | 
			
		||||
        )
 | 
			
		||||
@ -141,19 +141,19 @@ class TestRenderingMeshes(unittest.TestCase):
 | 
			
		||||
        rgb = images[0, ..., :3].squeeze().cpu()
 | 
			
		||||
        if DEBUG:
 | 
			
		||||
            Image.fromarray((rgb.numpy() * 255).astype(np.uint8)).save(
 | 
			
		||||
                DATA_DIR / "DEBUG_simple_sphere_light_gourad%s.png" % postfix
 | 
			
		||||
                DATA_DIR / "DEBUG_simple_sphere_light_gouraud%s.png" % postfix
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        # Load reference image
 | 
			
		||||
        image_ref_gourad = load_rgb_image(
 | 
			
		||||
            "test_simple_sphere_light_gourad%s.png" % postfix
 | 
			
		||||
        image_ref_gouraud = load_rgb_image(
 | 
			
		||||
            "test_simple_sphere_light_gouraud%s.png" % postfix
 | 
			
		||||
        )
 | 
			
		||||
        self.assertTrue(torch.allclose(rgb, image_ref_gourad, atol=0.005))
 | 
			
		||||
        self.assertTrue(torch.allclose(rgb, image_ref_gouraud, atol=0.005))
 | 
			
		||||
        self.assertFalse(torch.allclose(rgb, image_ref_phong, atol=0.005))
 | 
			
		||||
 | 
			
		||||
    def test_simple_sphere_elevated_camera(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test output of phong and gourad shading matches a reference image using
 | 
			
		||||
        Test output of phong and gouraud shading matches a reference image using
 | 
			
		||||
        the default values for the light sources.
 | 
			
		||||
 | 
			
		||||
        The rendering is performed with a camera that has non-zero elevation.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user