DirectX
8 Graphics
After installing the
DX 8 SDK, I receive the error LNK1104: Cannot Open File "d3dim.lib"
when attempting o compile my program.
I am using Direct3D to
draw a tile map to the screen. Why can't get the edges to match properly?
When I use the D3DX
shape creation functions to generate a mesh, there are no texture coordinates
in the vertices. How can I set texture coordinates?
How can I render to
multiple windows under DirectX 8 Graphics?
When loading a texture with the D3DX
texture creation functions I specify a color key, but no transparency appears
when I render the image.
I am rendering alpha blended
polygons and setting the alpha of the diffuse vertex component to determine
the opacity. It works when there is no texture set, but as soon as I set
a texture the alpha that I set is no longer applied. Why?
Why does rendering of pre-transformed
vertices appear to be slower in DX 8?
Why does rendering of an ID3DXMesh
object slow down significantly after I define subsets?
Why doesn't Intellisense offer code
completion options for DX 8 interfaces under VC++?
Will applications that I compile with
the DirectX 8.1 SDK be compatible with systems with the DirectX 8.0
runtimes?
I have heard that DirectX 8.1 no
longer supports Windows 95. Can I compile applications compatible with
Windows 95 if I have the DirectX 8.1 SDK installed?
Why do my calls to
IDirect3DDevice8::Getxxxx
fail?
When I draw an image using
ID3DXSprite::Draw() with 1:1 scaling, the sprite is different than the original
image size. Why?
Why does my programmable vertex
shader fail during creation on some hardware?
Q. After installing the DX 8 SDK, I
recieve the error LNK1104: Cannot Open File "d3dim.lib" when
attempting o compile my program.
After installing the DirectX 8 SDK, you may recieve the
following error when compiling existing source code written for previous
versions of DirectX:
LINK : fatal error LNK1104: cannot open file "d3dim.lib"
This is because the library for Direct3D Immediate Mode (now
called DirectGraphics) has been renamed as D3D8.LIB. To correct this, link
to D3D8.LIB instead of D3DIM.LIB.
Back to the Top
Back to Main Index
Q. I am using Direct3D to draw a
tile map to the screen. Why can't get the edges to match properly?
This is due to the algorithm used to determine what
pixels to draw when rendering a triangle, which is determined by whether the
center of each pixel is enclosed by the triangle. The pixel centers lie on
integer values, so if you are using integer coordinates to define a rectangle
the sides will straddle pixels.
To account for this, expand your pre-transformed primitives by
0.5 pixels in each direction. For an example of this, look at the source
code in A Simple Blit Function for Direct3D.
Back to the Top
Back to Main Index
Q. When I use the D3DX shape creation
functions to generate a mesh, there are no texture coordinates in the
vertices. How can I set texture coordinates?
To add texture coordinates, you will first have to use the D3DXCloneMeshFVF
function to create a duplicate of the mesh with a new vertex format which
contains elements for storing texture coordinates (tu,tv).
For an example of how to do this, take a look at the source code in Spherical
Texture Mapping.
Back to the Top
Back to Main Index
Q. How can I render to multiple
windows under DirectX 8 Graphics?
This can be accomplished by creating a swap chain for each
window, using
IDirect3DDevice8::CreateAdditionalSwapChain(), then setting the
appropriate chain's frame buffer as the render target before rendering.
For more information, see
Rendering to Multiple
Windows.
Back to the Top
Back to Main Index
Q. When loading a texture with the D3DX
texture creation functions I specify a color key, but no transparency appears
when I render the image.
Color keying is not directly supported in DirectX 8,
transparency instead being handled through alpha blending. If you need to
render color keyed images with transparency, the D3DX texture creation functions
bridge the gap by automatically generating an alpha mask that culls out pixels
of a specified color.
There are a couple of reasons that this may occur.
Probably the most common error is in specifying a key color with an alpha of
zero. Since bitmaps are assumed to be opaque, all pixel values read from
the file will be assigned an alpha of 255. Unless the key color has a
matching alpha value, the color key test will fail. You can prevent this
by using a color function that allows you to specify alpha, or by OR'ing your
color value with 0xff000000.
The other reason that color keying may fail is that the proper
alpha blending states have not been set. The following should be set prior
to rendering to achieve transparency:
pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
Back to the Top
Back to Main Index
Q. I am rendering with alpha
blending and setting the alpha of the diffuse vertex component to determine the
opacity. It works when there is no texture set, but as soon as I set a
texture the alpha that I set is no longer applied. Why?
The problem originates in the texture blending stages, rather
than in the subsequent alpha blending. Alpha can come from several
possible sources. If this has not been specified, then the alpha will be
taken from the texture, if one is selected. If no texture is selected,
then the default will use the alpha channel of the diffuse vertex component.
Explicitly specifying the diffuse vertex component as the source
for alpha will insure that the alpha is drawn from the alpha value you set,
whether a texture is selected or not:
pDevice->SetTextureStageState(D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
pDevice->SetTextureStageState(D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);
If you later need to use the texture alpha as the source, set
D3DTSS_ALPHAARG1 to
D3DTA_TEXTURE.
Back to the Top
Back to Main Index
Q. Why does rendering of
pre-transformed vertices appear to be slower in DX 8?
Unlike previous versions of Direct3D, DirectX Graphics 8 clips
pre-transformed vertices by default. To prevent this, set D3DRS_CLIPPING
to FALSE before rendering pre-transformed vertex formats.
Back to the Top
Back to Main Index
Q. Why does rendering of an ID3DXMesh
object slow down significantly after I define subsets?
You probably have not optimized the mesh after defining the face
attributes. If you specify attributes and then call ID3DXMesh::DrawSubset(),
this method must perform a search of the mesh for all faces containing the
requested attributes. In addition, the rendered faces are likely in a
random access pattern, thus not utilizing vertex cache. After defining the
face attributes for your subsets, call the ID3DXMesh::Optimize or
ID3DXMesh::OptimizeInPlace methods with the D3DXMESHOPT_ATTRSORT
flag. See Creating Subsets in
ID3DXMesh for more information.
Back to the Top
Back to Main Index
Q. Why doesn't Intellisense offer code
completion options for DX 8 interfaces under VC++?
The problem is that the IDE is drawing its information from the
older headers that were installed with VC++. It will also use information
from the headers in your project files, though simply using #include does not
cause them to be inventoried from the new headers. You can enable
Intellisense with the new interface by adding the header files containing the
definitions to your project (e.g. D3DX8.H and D3D8.H for Direct3D). Right
click on your project in the FileView pane, select "Add Files to Project...",
then select the necessary include files from the DXSDK\INCLUDE\ directory.
Back to the Top
Back to Main Index
Q. Will applications that I compile with
the DirectX 8.1 SDK be compatible with systems with the DirectX 8.0
runtimes?
By default, applications compiled under 8.1 will require the 8.1
runtimes to run, because some of the interfaces have changed and have different
GUIDs. However, you can specify a constant when creating the Direct3D
object that will use the 8.0 interfaces. Rather than creating an object as
shown in the docs with
g_pD3D=Direct3DCreate8(D3D_SDK_VERSION);
instead use
g_pD3D=Direct3DCreate8(120);
The value 120 is equal to the D3D_SDK_VERSION that was specified
in the DirectX 8.0 headers, which has been changed in the 8.1 SDK.
Specifying the original value will cause 8.0 version interfaces to be used by
Direct3D, providing compatibility with 8.0. Note that new features in 8.1,
such as the latest pixel shader versions (1.2 - 1.4), will not be available.
Back to the Top
Back to Main Index
Q. I have heard that DirectX 8.1 no
longer supports Windows 95. Can I compile applications compatible with
Windows 95 if I have the DirectX 8.1 SDK installed?
The DirectX 8.1 interfaces require Windows 98 or higher, and
will thus not be available on Windows 95. However, you can force
applications compiled under the DirectX 8.1 SDK to use the 8.0 interfaces,
allowing for Windows 95 compatibility. For information on how to specify
creation of 8.0 interface explicitly, go here.
Back to the Top
Back to Main Index
Q. Why do my calls to
IDirect3DDevice8::Getxxxx fail?
This usually occurs when using a pure device, that is, a device
created with the D3DCREATE_PUREDEVICE flag.
Such a device does not support any of the Get*() functions for any values that
can be stored in state blocks.
Back to the Top
Back to Main Index
Q. When I draw an image using
ID3DXSprite::Draw() with 1:1 scaling, the sprite is different than the original
image size. Why?
Since the image file is loaded into a texture, the bitmap is
scaled to match the capabilities of the hardware. In general, this means that
images that have dimensions that are not powers of 2 will be scaled up to the
nearest power of 2.
When loading an image with
D3DXCreateTextureFromFileEx(), you can pass a pointer to a
D3DXIMAGE_INFO structure, which will be filled with
information about the source image. You can then get the size of the texture
using IDirect3DTexture::GetLevelDesc() and
calculate the required scaling factor for 1:1 rendering:
LPDIRECT3DTEXTURE8 pText;
D3DXIMAGE_INFO info;
D3DXCreateTextureFromFileEx(....,&info,....,&pText);
D3DSURFACE_DESC desc;
pText->GetLevelDesc(0,&desc);
D3DXVECTOR2 vScaling;
vScaling.x=info.Width/desc.Width;
vScaling.y=info.Height/desc.Height;
Back to the Top
Back to Main Index
Q. Why does my programmable vertex
shader fail during creation on some hardware?
This may be because the device created by your application is
using hardware vertex processing, but the video hardware or driver does not
support the programmable vertex shader execution in hardware, or does not
implement the version of vertex shader code required by your shader. To
prevent this, you should check for vertex shader support when evaluating devices
that use hardware vertex processing. For example, if you are implementing
a vertex shader that requires Version 1.0 support, you would add the following
to the ConfirmDevice() code (assuming you are using the D3DApp framework):
if( (dwBehavior &
D3DCREATE_HARDWARE_VERTEXPROCESSING ) ||
(dwBehavior & D3DCREATE_MIXED_VERTEXPROCESSING ) )
{
if( pCaps->VertexShaderVersion < D3DVS_VERSION(1,0) )
return E_FAIL;
}
You do not need to perform this check on devices using software
vertex processing, as shader support is guaranteed through emulation.
Back to the Top
Back to Main Index