Abstract:
Three dimensional computer graphic images are shaded by first supplying data which defines the objects to be inserted into the image, this data including depth data relating to the objects. A depth store ( 4 ) includes data for objects already inserted into the image and a depth comparison unit ( 6 ) compares the depth of an object to be inserted with the currently stored depth data for a particular pixel. The result of this is used to determine which of a number of depth operations is to be applied to the depth store ( 4 ). A blending value is selected for each pixel for combining the object with the image in dependence on the selected depth operation. A combining unit then combines the object with the image in proportions dependent upon the selecting blending value.

Description:
This application is a continuation of application Ser. No. 09/662 946, filed Sep. 15, 2000, now abandoned. 
    
    
     FIELD OF THE INVENTION 
     This invention relates to a method and apparatus for shading and texturing three dimensional computer generated graphic images and in particular to methods and apparatus which generate so called “volumetric” effects through the use of depth based blending. For example a cloud, where the degree to which the cloud or any object contained partially or fully within is visible, is dependent on how much of the cloud a ray cast from the eye must pass through before either exiting the cloud or “impacting” another object. 
     BACKGROUND OF THE INVENTION 
     Software blending of volumes can be derived from the distance between the volume&#39;s front vertices and its back faces, or an object that lies between them. This is achieved by casting a ray through each front facing vertex, and determining the distance it travels before impacting either a back face of the volume or an object contained within. This distance can then be used as an alpha value for the vertex which the ray was cast through. These per vertex blend factors can then be interpolated across the surfaces of the volume. However, as the blend factors are calculated per vertex any irregularities that occur in between them will not be taken into account. Thus, to accurately render a scene, the volume objects must contain a large number of vertices, or, in the extreme case, a vertex per screen pixel that is covered by the volume. This large number of vertices coupled with the fact that a ray must be cast through and tested against a large number of other object faces make this technique extremely inefficient. 
     Most 3D graphic systems operate by using the well known technique of Z or depth buffering. Objects to be rendered into a scene have depth values associated with them which can be used to derive a depth value for each pixel intersected by the object. These are compared with the current depth values in the depth buffer for each pixel. If an object is found to be in front of the current stored depth a new value can be overwritten into the depth buffer. 
     Many 3D graphics systems also use the well known technique of stencil buffering. This technique utilises a second parallel buffer that will typically contain between one and eight bits per pixel. When an object is to be written into a scene, in addition to the depth buffer comparison summarised above, a stencil buffer comparison with the current stencil buffer value is made for each pixel and a new stencil buffer value may be written. This comparison is used to select one of a set of stencil operations which are performed on the stencil buffer. These are designated as follows: 
     SOP 1 =stencil test fails, 
     SOP 2 =stencil test passes and depth test fails, 
     SOP 3 =stencil and depth tests both pass. 
     Thus, if the stencil test passes and the depth test fails, operation SOP 2  will be assigned to the stencil buffers. Examples of the operations which can be assigned to SOP 1 , SOP 2  and SOP 3  are as follows: 
     Keep=keep Stencil value, 
     zero=replace stencil value with zero, 
     Replace=replace stencil value with reference value, 
     INCRSAT=increment stencil with clamping at a maximum value, 
     DECRSAT=decrement stencil with clamping at a minimum value, 
     Invert=invert stencil value, 
     INCR=increment stencil value, 
     DECR=decrement stencil value. 
     Thus, each object in the supplied object list will have a particular set of functions assigned to SOP 1 , SOP 2  and SOP 3 . The object stencil value and the value within the stencil buffer are then combined using the selected operation in dependence on the stencil and depth tests. The result is then written back to the stencil buffer. The depth is subsequently only updated if both the stencil and depth buffer test succeed. 
     SUMMARY OF THE INVENTION 
     A preferred embodiment of the present invention provides a method and apparatus, which are able to implement volumetric effects, such as forming clouds, efficiently. To do this it provides a set of depth buffer operations which allow depth values to be manipulated arithmetically. These operations allow a depth or blending value to be formed that can be representative of the distance between the front and back of the volume. After derivation, these values can be passed to a texture blending unit in which they can be used to blend other components such as iterated colours, textures, or any other source applicable to texture blending. The result from the texture blending unit can then be alpha blended with the current contents of the frame buffer. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     A preferred embodiment of the invention will now be described in detail, by way of example, with reference to the single figure, FIG. 1 which is a block diagram of an embodiment of the invention. 
    
    
     DETAILED DESCRIPTION 
     FIG. 1 illustrates an example of how depth based blending can be implemented. A stencil buffer which will provide the result of the stencil test to this circuit is not shown. This, however, will be standard stencil buffer circuitry which will be familiar to those skilled in the art with an extra output from the stencil comparison unit  8  feeding into the select depth operation unit  20  in the figure. This circuit solves the problem faced with current hardware in which operations applied to the depth buffer are restricted to simple keep or replace operations based on success or failure of the depth and stencil comparison. This embodiment of the invention seeks to increase the number of different operations which can be performed on the depth buffer thereby increasing the number of effects which can be applied. 
     This is achieved by the use of a select depth operation unit  20 , responsive to the results of the depth comparison in unit  6  and the stencil comparison in stencil comparison unit  8 , to select one of three operations DOP 1 , DOP 2 , DOP 3 . These may each have one of typically 8 different operations assigned to them for each object. The list could be longer than 8. 
     The operations would be selected as follows: 
     DOP 1 =stencil test fails, 
     DOP 2 =stencil test passes and depth test fails, 
     DOP 3 =stencil and depth tests both pass. 
     Each of these will have assigned to it one of the following depth buffer operations: 
     Keep=current depth, 
     Zero=set depth buffer to zero, 
     max=set depth buffer to its maximum value, 
     Replace=replace depth buffer value with object depth, 
     Add=add object depth to depth buffer value, 
     Subtract=subtract depth buffer value from object depth, 
     Reverse subtract=subtract object depth from depth buffer value. 
     Note that all arithmetic operations will saturate at one and zero. 
     Because arithmetic operations on the depth buffer are permitted, using this system it becomes possible to construct pixel specific values that reflect the distance between objects within the depth plane. These values can be used, after modification, as alpha values for a blend. 
     In the figures the depth compare unit  6  compares an object depth from the object list with the current depth stored in the depth buffer  4  for a particular pixel and outputs the result to the select depth operation unit  20 . Depth operation unit  20  also receives the result of the stencil comparison unit  8 . In response to the two input values, one of the operations DOP 1 , DOP 2  and DOP 3  is selected by the depth operation unit  20 . 
     The selected operation will be applied in an apply depth operation unit  22  which receives the same input as the depth comparison unit  6 . Apply depth operation unit  22  is thus able to combine the object depth and depth buffer value using the selected operation. This output can be written into the depth buffer  4 . If necessary, a write enable line (not illustrated) will be provided to the depth buffer for this. 
     The range of values to be supplied by the depth buffer  4  is defined to be in the range zero to one. However, depth based blending effects require a range of depth values which correspond to the full, or some fraction of, the range of alpha blend values, again zero to one, and this may not cover the full depth buffer range. For example, a cloud could occupy a small range of depth values although the required blending affect might require a full range of alpha values. In order to overcome this problem, the depth value used must be (a) offset such that its base value lies at zero, and (b) scaled such that its maximum value lies at either one or the required maximum. This operation comprises: 
     
       
         DepthAlpha=(Depth+Offset)×Scale. 
       
     
     The addition of the offset should be signed and should saturate at zero and one. The scale should be unsigned and should saturate at one. 
     These operations are performed in the offset and scale units numbered  24  and  26  respectively in FIG.  1 . The depth and scale values are controlled by parameters associated with the object list in a well known manner. 
     Once the alpha value for the texture blend has been derived, it is then combined with colour or texture in a texture blend unit  28 . This allows the depth value to be modified by the full range of texture blending operations. For example, the depth alpha value could be modulated against a texture that represents the “density” of the volume, resulting in an alpha value which may vary per pixel in relation to both depth and the applied texture. The result is then used in alpha blend unit  30  to combine the new object with the current contents of the frame buffer  32  as appropriate. 
     The system is not limited to the use of three depth buffer operations (DOP 1 , DOP 2 , DOP 3 ). With both stencil and depth test comparisons being used to generate selection bits, a total of four operations could be used. Alternatively if only a single bit from the depth buffer was used, a choice between two operations could be made. 
     An example of use of the invention is now described for rendering a cloud into a scene to be displayed. Objects of this type, to which a depth dependent alpha are applied, will be rendered into a scene after all other objects. 
     A cloud is formed from a convex mesh of polygons which is split by the 3D graphics system into front and back facing faces in a well known manner. The back faces of the mesh are first rendered by assigning to the depth selection unit  20  in the figure the three alternative functions as follows: 
     DOP 1 =keep value of depth buffer 
     DOP 2 =keep value of depth buffer 
     DOP 3 =replace value in depth buffer 
     This results in well known depth buffer behavior. That is to say, the depth buffer is up-dated if the cloud polygons lie in front of the current depth. These polygons are not required to up-date the frame buffer as their visibility would depend on the front half of the cloud which will later be rendered into the frame buffer. To achieve this a null alpha blend mode is set up such that no blending takes place. As no blending is being performed the scale and offset values need not be set. 
     After this, the front faces of the polygons of the cloud are rendered with the following depth operations set up as inputs to select depth operation unit  20 : 
     DOP 1 =zero depth buffer value 
     DOP 2 =zero depth buffer value 
     DOP 3 =Subtract depth buffer value from current depth 
     This will result in either a value of zero being generated from the depth buffer or the distance between the front faces of the polygons and either the back faces, or any object that lies between them being a generated by the subtract operation. The value generated can then be scaled such that pixels that have a maximum value result in the required maximum alpha value. Any pixel that has no distance between front and back polygon faces results in the value of zero so no offset need be applied, i.e. it is set to zero. 
     The result of the scaling and offset units  24  and  26  is then applied to the texture blend unit  28 . This can be set up such that the depth alpha value is multiplied by the alpha of a texture that is mapped onto the front facing polygons of the cloud. The texture may contain any image that the application requires. In this particular example the colour channels would represent the detail of the cloud surface and the alpha channel would represent the clouds density. As a result, an alpha value is generated that is not only proportional to the distance between the front and back of the cloud but is also proportionate to the alpha channel of the cloud texture. 
     The result from the texture blending unit  28  can now be passed to the alpha blending unit  30  where an alpha blend with the current contents of the frame buffer is performed in a well known manner. The blend function required will be a linear blend between the frame buffer values and those of the “modulated” text. As a result, the frame buffer images are obscured by the cloud texture in a manner which is proportional to the thickness and density of the cloud. For example, where the cloud is thin or has a low density the original contents of the frame buffer will predominate and where the cloud is thick or has a high density the cloud will predominate. Thus, the result of the subtraction between the front surface of the cloud and its rear surface, or the surface of an intermediate object controls the alpha value selected. 
     In a further embodiment, a secondary depth buffer  34  may be used to allow the original depth values from the frame buffer to be retained. This can be useful in situations such as when multiple intersecting volumes are to be rendered. 
     It will be appreciated that DOP 1  &amp; DOP 2  select the same operation. It is therefore apparent that the selection is being made on the basis of passing or failing of the depth test. Therefore, a simplified embodiment would dispense with the stencil test as a selection input. 
     A further embodiment allows the volumes to be processed as monolithic objects. As the volume would be presented as a “whole” it is possible to handle multiple per pixel entries and exits to/from the volume, as such concave volumes can be handled. Also, as the object would be represented as a volume, no destructive write to the depth buffer is required. 
     This improvement can be implemented in any standard graphics system and it is hoped that it will be included in the Microsoft Direct 3D Immediate Mode System for Writing 3D Graphics and will thus enable software to be written to configure a standard computer to embody the invention.