Win3x.Org
http://www.win3x.org/win3board/

Accélération 3D
http://www.win3x.org/win3board/viewtopic.php?f=14&t=26249
Page 1 sur 1
Auteur :  gm86 [ 06 mars 2019 23:09 ]
Sujet du message :  Accélération 3D

Introduction

Je me rappelle de la couverture du livre OpenGL 1.2 dans une enseigne de grande ville, il y a une douzaine d'années. Je ne savais pas que l'exemplaire sur la version 2.0 sortait alors. Qu'aurais-je appris avec cela ? Je ne fis pas l'effort d'y jeter un œil.

Aujourd'hui, j'ai décidé de sortir de la poussière une rustique API propriétaire. Il s'agit du Glide de 3Dfx, inspiré par l'OpenGL et adapté à la carte Voodoo. Je pense que cela me permettra mieux d'approfondir l'accélération 3D. Préparez vos émulateurs !

Première chose, s'équiper d'un système Win9x et consulter une liste personnelle de liens :
viewtopic.php?t=26193

Deuxième chose, procéder aux téléchargements.
D'abord, obtenir le compilateur Visual C++ 6.0 [en] [es] [fr] (le lien soi-disant MSDN pointe en fait la suite de Visual Studio [es] [fr]) :
https://winworldpc.com/product/microsoft-visual-stu/60
Ensuite, télécharger les SKD Glide 2 et 3 respectivement depuis les liens suivants :
G2SDK.EXE
G3SDK.EXE
Enfin, télécharger le SKD pour Glide 3 sous Linux depuis le lien suivant en prévision de l'erreur "grSstWinOpen: need to use a valide windows handle" (WinMe) :
glide3x.tar.gz

Troisième chose, être guidé :
3D Explained
Glide 3 Tutorial


Les MIP maps

[ img ]
Après avoir décompressé G3SDK.EXE dans la racine du lecteur D:, par exemple, nous allons compiler tous les tests du Glide 3. Pour cela, il faut ouvrir l'espace de travail D:\3Dfx\Sdk\Glide3x\Src\Tests\MSVC5tests\MSVC5tests.dsw et autoriser la conversion. Ensuite, on choisit le menu "Build/Batch Build..." et on valide. On peut alors aller dans le répertoire parent et essayer chaque test.

Cependant, sous un système postérieur à Windows 98SE, vous risquez d'obtenir l'erreur "grSstWinOpen: need to use a valide windows handle". Un coup d'œil au répertoire "glide3x\h3\glide3\tests\" de l'archive glide3x.tar.gz nous indiquera comment procéder :
- dans le répertoire D:\3Dfx\Sdk\Glide3x\Src\Tests, remplacer les fichiers tlib.c et tlib.h par ceux de l'archive ;
- dans chaque fichier TEST??.C, indiquer tlGethWnd comme premier paramètre de grSstWinOpen à la place de zéro.

Par fainéantise, on ne va rectifier que le fichier TEST20.C du SDK GLide3x. Ensuite, on rend le projet TEST20 actif dans l'espace de travail via le menu "Project/Set Active Project/test20". Enfin, on reconstruit à nouveau TLIB.LIB ET TLIB.OBJ en choisissant le menu "Build/Rebuild All".

On lance alors une version opérante de TEST20.EXE depuis son répertoire. Grâce à son animation, on remarque les différentes interpolations 2D :
- filtrage bilinéaire seul, crénelage dans la texture quand elle s'éloigne dû à sa résolution unique (sa propre taille en l'absence de mipmaps) ;
- filtrage bilinéaire avec mipmapping, juxtaposition apparente des différentes résolutions (mipmaps) le long de l'axe Z ;
- filtrage trilinéaire (en deux passes ici pour Voodoo à TMU unique), lissage des transitions entre mipmaps.
Ce dernier mode reste moins convaincant qu'un filtrage anisotrope car plus flou. Si son aspect est granuleux, c'est que vous utilisez le fichier Glide3x.dll d'un driver kit Voodoo3 supérieur à la version 1.04.04b (d'où l'aspect flou d'un jeu OpenGL avec une carte Voodoo5).
563.PNG 588.PNG
Un LOD Bias positif n'est en effet profitable qu'à un filtrage bilinéaire :
Citation :
LOD Bias

Glide allows an application to control an arbitrary factor known as LOD bias; it affects the point at which mipmapping levels change. Increasing values for LOD bias makes the overall images blurrier or smoother. Decreasing values make the overall images sharper. Selection of LOD bias is a qualitative judgment that is application and texture dependent. LOD bias can be any value in the range [-8.0..7.75]. However, the hardware will snap LOD bias to the nearest quarter. There is no "best" setting for the LOD bias; it is a very subjective control. Some textures look better if sharper than "normal", while others look better blurred.

The LOD bias is controlled with the function grTexLodBiasValue(). The first argument, tmu, identifies the TMU to modify; valid values are GR_TMU0, GR_TMU1, and GR_TMU2. The second argument, bias, is a signed floating point value in the range [-8..7.75].

void grTexLodBiasValue( GrChipID_t tmu, float bias )



grTexLodBiasValue() changes the current LOD bias value, which allows an application to maintain fine grain control over the effects of mipmapping, specifically when mipmap levels change. The LOD bias value is added to the LOD calculated for a pixel and th e result determines which mipmap level to use. An LOD of n is calculated when a pixel covers approximately 2^2n texels. For example, when a pixel covers approximately one texel, the LOD is 0; when a pixel covers four texels, the LOD is 1; when a pixel cover s 16 texels, the LOD is 2. Smaller LOD values make increasingly sharper images that may suffer from aliasing and moirè effects. Larger LOD values make increasingly smooth images that may suffer from becoming too blurry. The default LOD bias value is 0.0.

During some special effects, an LOD bias may help image quality. If an application is not performing texture mapping with trilinear filtering or dithered mipmapping, then an LOD bias of +.5 generally improves image quality by rounding to the nearest LOD. If an application is performing dithered mipmapping (i.e. grTexMipMapMode() is GR_MIPMAP_NEAREST_DITHER), then an LOD bias of 0.0 or +.25 generally improves image quality. An LOD bias value of 0.0 is usually best with trilinear filtering.
Dans ce cas, il serait souhaitable de diminuer sa valeur de 0,5 via FX_GLIDE_LOD_BIAS=-2 (variable introduite dans ces versions-là).

Notons les différences par rapport à la version Glide 2 (Win32) :
- étant une application CONSOLE lançant elle-même la fenêtre, seule la bibliothèque tlib nécessite __WIN32__ ;
- plus d'appel GrHwConfiguration, de même qu'à présent, tlib.c obtient lui-même le type de matériel ;
- pointeur *version à la place du tableau version[80] ;
- la structure GrVertex n'existant plus, il faut définir soi-même le minimum nécessaire à la profondeur et aux textures via les nouveaux appels GrVertexLayout (x & y, 1/w, s & t dans TMU0) ;
- la palette de couleurs n'étant plus spécifique à une TMU, l'appel grTexDownloadTable est devenu global.


Le filtrage trilinéaire simple passe

[ img ]
Je ne l'ai recontré que dans un jeu Glide : Powerslide via un gestionnaire Glide2x.dll non spécifique à la carte Banshee. Il est trop contraignant pour les jeux basés sur le multitexturing.

Sous Windows 9x, le dernier driver kit Voodoo3 compatible Banshee (version 1.04) a une particularité : ses gestionnaires Glide sont incompatibles avec les anciens kits et vice-versa. D'ailleurs, son fichier Glide3x.dll est similaire à celui du premier driver kit pour Windows 2000. Il est optimisé pour les textures 512x512 proposées par Quake3 (l'architecture Glide s'arrêtant à 256x256) sans devoir sacrifier une TMU. Avec le gestionnaire OpenGL ICD correspondant (compatible Voodoo²), c'est la version saturant le moins la mémoire graphique avec cette résolution de textures ; l'alternative étant de faire coopérer Glide2x.dll avec WickedGL sans triple tampon. Son défaut : les artefacts lorsque les deux TMU de la carte s'associent pour faire du filtrage trilinéaire en une seule passe.
518.PNG

Créons-nous un répertoire de travail. Copions-y les nouveaux fichiers tlib.c, tlib.h et les fichier tldata.inc et decal1.3df, puis recopions-y les fichiers tril1pas.dsw, tri1pass.c et tri1pass.dsp suivants :
Espace de travail.
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!

###############################################################################

Project: "tlib"=.\tlib\tlib.dsp - Package Owner=<4>

Package=<5>
{{{
}}}

Package=<4>
{{{
}}}

###############################################################################

Project: "tril1pas"=.\tril1pas.dsp - Package Owner=<4>

Package=<5>
{{{
}}}

Package=<4>
{{{
    Begin Project Dependency
    Project_Dep_Name tlib
    End Project Dependency
}}}

###############################################################################

Global:

Package=<5>
{{{
}}}

Package=<3>
{{{
}}}

###############################################################################

Fichier source.
  • Correction par rapport à la documentation 3Dfx : GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL
    qui équivaut à GR_COMBINE_FUNCTION_BLEND.
  • Pas de vérification matérielle.
  /*
** Cf. TEST20.C (G3SDK.EXE), 3Dfx Interactive.
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <assert.h>

#include <glide.h>
#include "tlib.h"


static const char *version;

static const char name[]    = "tri1pas";
static const char purpose[] = "single-pass trilinear mipmapping";
static const char usage[]   = "-n <frames> -r <res>";


void main( int argc, char **argv) {
    char match; 
    char **remArgs;
    int  rv;

    GrScreenResolution_t resolution = GR_RESOLUTION_640x480;
    float                scrWidth   = 640.0f;
    float                scrHeight  = 480.0f;
    int frames                      = -1;

    TlTexture  texture;
    TlVertex3D srcVerts[4];
    float      distance, dDelta;

    FxU32      zrange[2];

    /* Process Command Line Arguments */
    while( rv = tlGetOpt( argc, argv, "nr", &match, &remArgs ) ) {
        if ( rv == -1 ) {
            printf( "Unrecognized command line argument\n" );
            printf( "%s %s\n", name, usage );
            printf( "Available resolutions:\n%s\n",
                    tlGetResolutionList() );
            return;
        }
        switch( match ) {
        case 'n':
            frames = atoi( remArgs[0] );
            break;
        case 'r':
            resolution = tlGetResolutionConstant( remArgs[0], 
                                                  &scrWidth, 
                                                  &scrHeight );
            break;
        }
    }

    tlSetScreen( scrWidth, scrHeight );

    version = grGetString( GR_VERSION );

    printf( "%s:\n%s\n", name, purpose );
    printf( "%s\n", version );
    printf( "Resolution: %s\n", tlGetResolutionString( resolution ) );
    if ( frames == -1 ) {
        printf( "Press A Key To Begin Test.\n" );
        tlGetCH();
    }
    
    /* Initialize Glide */
    grGlideInit();

    grSstSelect( 0 );
    assert( grSstWinOpen( tlGethWnd(),
                      resolution,
                      GR_REFRESH_60Hz,
                      GR_COLORFORMAT_ABGR,
                      GR_ORIGIN_LOWER_LEFT,
                      2, 1 ) );
    
    tlConSet( 0.0f, 0.0f, 1.0f, 0.5f, 
              60, 15, 0xffffff );
    
    /* Set up Render State - Decal Texture - bilinear */
    grGet(GR_ZDEPTH_MIN_MAX, 8, zrange);  
    grVertexLayout(GR_PARAM_XY,  GR_VERTEX_X_OFFSET << 2, GR_PARAM_ENABLE);
    grVertexLayout(GR_PARAM_Q,   GR_VERTEX_OOW_OFFSET << 2, GR_PARAM_ENABLE);
    grVertexLayout(GR_PARAM_ST0, GR_VERTEX_SOW_TMU0_OFFSET << 2, GR_PARAM_ENABLE);

    grColorCombine( GR_COMBINE_FUNCTION_SCALE_OTHER,
                    GR_COMBINE_FACTOR_ONE,
                    GR_COMBINE_LOCAL_NONE,
                    GR_COMBINE_OTHER_TEXTURE,
                    FXFALSE );
    grTexFilterMode( GR_TMU0,
                     GR_TEXTUREFILTER_BILINEAR,
                     GR_TEXTUREFILTER_BILINEAR );
    grTexFilterMode( GR_TMU1,
                     GR_TEXTUREFILTER_BILINEAR,
                     GR_TEXTUREFILTER_BILINEAR );
    
    /* Load texture data into system ram */
    assert( tlLoadTexture( "DECAL1.3df", 
                           &texture.info, 
                           &texture.tableType, 
                           &texture.tableData ) );

    /* Download texture data to TMUs */
    grTexDownloadMipMap( GR_TMU0,
                         grTexMinAddress( GR_TMU0 ),
                         GR_MIPMAPLEVELMASK_EVEN,
                         &texture.info );
    grTexDownloadMipMap( GR_TMU1,
                         grTexMinAddress( GR_TMU1 ),
                         GR_MIPMAPLEVELMASK_ODD,
                         &texture.info );
    if ( texture.tableType != NO_TABLE ) {
        grTexDownloadTable( texture.tableType,
                            &texture.tableData );
    }


    /* Initialize Source 3D data - Rectangle on X/Z Plane 
       Centered about Y Axis

       0--1  Z+
       |  |  |
       2--3   - X+

     */
    srcVerts[0].x = -0.5f, srcVerts[0].y = 0.0f, srcVerts[0].z =  0.5f, srcVerts[0].w = 1.0f;
    srcVerts[1].x =  0.5f, srcVerts[1].y = 0.0f, srcVerts[1].z =  0.5f, srcVerts[1].w = 1.0f;
    srcVerts[2].x = -0.5f, srcVerts[2].y = 0.0f, srcVerts[2].z = -0.5f, srcVerts[2].w = 1.0f;
    srcVerts[3].x =  0.5f, srcVerts[3].y = 0.0f, srcVerts[3].z = -0.5f, srcVerts[3].w = 1.0f;

    srcVerts[0].s = 0.0f, srcVerts[0].t = 0.0f;
    srcVerts[1].s = 1.0f, srcVerts[1].t = 0.0f;
    srcVerts[2].s = 0.0f, srcVerts[2].t = 1.0f;
    srcVerts[3].s = 1.0f, srcVerts[3].t = 1.0f;

#define RED  0x000000ff
#define BLUE 0x00ff0000

#define MAX_DIST 2.5f
#define MIN_DIST 1.0f

    distance = 1.0f;
    dDelta   = 0.01f;

    tlConOutput( "Press any key to quit\n\n" );
    while( frames-- && tlOkToRender()) {
        GrVertex vtxA, vtxB, vtxC, vtxD;
        TlVertex3D xfVerts[4];
        TlVertex3D prjVerts[4];

        grBufferClear( 0x00404040, 0, zrange[1] );

        tlConOutput( "GR_MIPMAP_TRILINEAR (GLIDE_NUM_TMU > 1)\r" );
        grTexMipMapMode( GR_TMU0,
                         GR_MIPMAP_NEAREST,
                         FXTRUE );
        grTexMipMapMode( GR_TMU1,
                         GR_MIPMAP_NEAREST,
                         FXTRUE );
        grTexSource( GR_TMU0,
                     grTexMinAddress( GR_TMU0 ),
                     GR_MIPMAPLEVELMASK_EVEN,
                     &texture.info );
        grTexSource( GR_TMU1,
                     grTexMinAddress( GR_TMU1 ),
                     GR_MIPMAPLEVELMASK_ODD,
                     &texture.info );
        grTexCombine( GR_TMU0,
                      GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
                      GR_COMBINE_FACTOR_LOD_FRACTION,
                      GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL,
                      GR_COMBINE_FACTOR_LOD_FRACTION,
                      FXFALSE,
                      FXFALSE );
        grTexCombine( GR_TMU1,
                      GR_COMBINE_FUNCTION_LOCAL,
                      GR_COMBINE_FACTOR_NONE,
                      GR_COMBINE_FUNCTION_LOCAL,
                      GR_COMBINE_FACTOR_NONE,
                      FXFALSE,
                      FXFALSE );

            

        /*---- 
          A-B
          |\|
          C-D
          -----*/
        vtxA.oow = 1.0f;
        vtxB = vtxC = vtxD = vtxA;

        distance += dDelta;
        if ( distance > MAX_DIST || 
             distance < MIN_DIST ) { 
            dDelta *= -1.0f;
            distance += dDelta;
        }

        tlSetMatrix( tlIdentity() );
        tlMultMatrix( tlXRotation( -20.0f ) );
        tlMultMatrix( tlTranslation( 0.0f, -0.3f, distance ) );

        tlTransformVertices( xfVerts, srcVerts, 4 );
        tlProjectVertices( prjVerts, xfVerts, 4 );

        vtxA.x = tlScaleX( prjVerts[0].x );
        vtxA.y = tlScaleY( prjVerts[0].y );
        vtxA.oow = 1.0f / prjVerts[0].w;

        vtxB.x = tlScaleX( prjVerts[1].x );
        vtxB.y = tlScaleY( prjVerts[1].y ); 
        vtxB.oow = 1.0f / prjVerts[1].w;
        
        vtxC.x = tlScaleX( prjVerts[2].x );
        vtxC.y = tlScaleY( prjVerts[2].y );
        vtxC.oow = 1.0f / prjVerts[2].w;

        vtxD.x = tlScaleX( prjVerts[3].x ); 
        vtxD.y = tlScaleY( prjVerts[3].y );
        vtxD.oow = 1.0f / prjVerts[3].w;

        vtxA.tmuvtx[0].sow = prjVerts[0].s * 255.0f * vtxA.oow;
        vtxA.tmuvtx[0].tow = prjVerts[0].t * 255.0f * vtxA.oow;

        vtxB.tmuvtx[0].sow = prjVerts[1].s * 255.0f * vtxB.oow;
        vtxB.tmuvtx[0].tow = prjVerts[1].t * 255.0f * vtxB.oow;

        vtxC.tmuvtx[0].sow = prjVerts[2].s * 255.0f * vtxC.oow;
        vtxC.tmuvtx[0].tow = prjVerts[2].t * 255.0f * vtxC.oow;

        vtxD.tmuvtx[0].sow = prjVerts[3].s * 255.0f * vtxD.oow;
        vtxD.tmuvtx[0].tow = prjVerts[3].t * 255.0f * vtxD.oow;


        grDrawTriangle( &vtxA, &vtxB, &vtxD );
        grDrawTriangle( &vtxA, &vtxD, &vtxC );


        tlConRender();
        grBufferSwap( 1 );
        grFinish();
        
        if ( tlKbHit() ) frames = 0;        
    }
    
    grGlideShutdown();
    return;
}



Fichier projet.
  • Ajout à # ADD CPP :
    /I "D:\3Dfx\Sdk\Glide3x\Src\Include" /D "__MSC__"
  • Ajouts à # ADD LINK32 :
    glide3x.lib tlib.lib /libpath:"D:\3Dfx\Sdk\Glide3x\Src\Lib\Win32"
    Dans CFG=tril1pas - Win32 Release :
    /libpath:".\tlib\release"
    Dans CFG=tril1pas - Win32 Debug :
    /libpath:".\tlib\debug"
  • Modification de # PROP Output_Dir :
    ".\"
# Microsoft Developer Studio Project File - Name="tril1pas" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **

# TARGTYPE "Win32 (x86) Console Application" 0x0103

CFG=tril1pas - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE 
!MESSAGE NMAKE /f "tril1pas.mak".
!MESSAGE 
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE 
!MESSAGE NMAKE /f "tril1pas.mak" CFG="tril1pas - Win32 Debug"
!MESSAGE 
!MESSAGE Possible choices for configuration are:
!MESSAGE 
!MESSAGE "tril1pas - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "tril1pas - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE 

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe

!IF  "$(CFG)" == "tril1pas - Win32 Release"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir ".\"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "D:\3Dfx\Sdk\Glide3x\Src\Include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__MSC__" /YX /FD /c
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 glide3x.lib tlib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"D:\3Dfx\Sdk\Glide3x\Src\Lib\Win32" /libpath:".\tlib\release"


!ELSEIF  "$(CFG)" == "tril1pas - Win32 Debug"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir ".\"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "D:\3Dfx\Sdk\Glide3x\Src\Include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "__MSC__" /YX /FD /GZ /c
# ADD BASE RSC /l 0x40c /d "_DEBUG"
# ADD RSC /l 0x40c /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 glide3x.lib tlib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"D:\3Dfx\Sdk\Glide3x\Src\Lib\Win32" /libpath:".\tlib\debug"


!ENDIF 

# Begin Target

# Name "tril1pas - Win32 Release"
# Name "tril1pas - Win32 Debug"
# Begin Source File

SOURCE=.\tril1pas.c
# End Source File
# End Target
# End Project
Puis, copions le fichier tlib.dsp suivant dans le sous-répertoire tlib :
  • Ajout à # ADD CPP :
    /I "D:\3Dfx\Sdk\Glide3x\Src\Include" /D "__MSC__" /D "__WIN32__"
# Microsoft Developer Studio Project File - Name="tlib" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **

# TARGTYPE "Win32 (x86) Static Library" 0x0104

CFG=tlib - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE 
!MESSAGE NMAKE /f "tlib.mak".
!MESSAGE 
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE 
!MESSAGE NMAKE /f "tlib.mak" CFG="tlib - Win32 Debug"
!MESSAGE 
!MESSAGE Possible choices for configuration are:
!MESSAGE 
!MESSAGE "tlib - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "tlib - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE 

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe

!IF  "$(CFG)" == "tlib - Win32 Release"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "D:\3Dfx\Sdk\Glide3x\Src\Include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "__MSC__" /D "__WIN32__" /YX /FD /c
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo

!ELSEIF  "$(CFG)" == "tlib - Win32 Debug"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "D:\3Dfx\Sdk\Glide3x\Src\Include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "__MSC__" /D "__WIN32__" /YX /FD /GZ /c
# ADD BASE RSC /l 0x40c /d "_DEBUG"
# ADD RSC /l 0x40c /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo

!ENDIF 

# Begin Target

# Name "tlib - Win32 Release"
# Name "tlib - Win32 Debug"
# Begin Group "Source Files"

# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File

SOURCE=..\tlib.c
# End Source File
# End Group
# Begin Group "Header Files"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=..\tlib.h
# End Source File
# End Group
# End Target
# End Project

Pour finir, compilons :
- ouvrons tril1pas.dsw ;
- choisissons tril1pas - Win32 Release dans le menu Build/Set Active Project Configuration ;
- appuyons sur la touche F7.

Remarque : il n'y a pas eu besoin de définir s & t pour la TMU1.

Page 1 sur 1 Fuseau horaire sur UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/