//Set up variables bool DemoInit() { if(!window.Init("Project Template", 640, 480, 32, 24, 8, WINDOWED_SCREEN)) return 0; //quit if not created SetUpARB_multitexture(); SetUpEXT_texture3D(); SetUpEXT_texture_edge_clamp(); SetUpNV_register_combiners(); SetUpNV_texture_shader(); SetUpNV_vertex_program(); if( !EXT_texture_edge_clamp_supported || !ARB_multitexture_supported || !NV_vertex_program_supported || !NV_register_combiners_supported) return false; //Check we have at least 3 texture units GLint maxTextureUnitsARB; glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnitsARB); if(maxTextureUnitsARB<3) { errorLog.OutputError("I require at least 3 texture units"); return false; } //Set light colors lightColors[0].Set(1.0f, 1.0f, 1.0f, 1.0f); lightColors[1].Set((float)47/255, (float)206/255, (float)240/255, 1.0f); lightColors[2].Set((float)254/255, (float)48/255, (float)18/255, 1.0f); lightColors[3].Set((float)83/255, (float)243/255, (float)29/255, 1.0f); //Load textures //Decal image decalImage.Load("decal.tga"); glGenTextures(1, &decalTexture); glBindTexture(GL_TEXTURE_2D, decalTexture); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, decalImage.width, decalImage.height, 0, decalImage.format, GL_UNSIGNED_BYTE, decalImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Create light textures if(!InitLightTextures( atten1DTexture, atten2DTexture, atten3DTexture, gaussian1DTexture, gaussian2DTexture)) return false; camera.Init(VECTOR3D(0.0f, 0.0f, 3.5f)); //reset timer for start timer.Reset(); return true; }
//Set up variables bool DemoInit() { if(!window.Init("Render To Texture", 640, 480, 32, 24, 8, WINDOWED_SCREEN)) return 0; //quit if not created camera.Init(VECTOR3D(0.0f, 0.0f, -2.5f), 2.0f, 100.0f); //Set up extensions if( !SetUpWGL_ARB_extensions_string()) return false; SetUpEXT_texture_filter_anisotropic(); SetUpSGIS_generate_mipmap(); //Get the WGL extensions string const char * wglExtensions; wglExtensions=wglGetExtensionsStringARB(window.hDC); //Set up wgl extensions if( !SetUpWGL_ARB_pbuffer(wglExtensions) || !SetUpWGL_ARB_pixel_format(wglExtensions) || !SetUpWGL_ARB_render_texture(wglExtensions)) return false; //Init the pbuffer int pbufferExtraIAttribs[]={WGL_BIND_TO_TEXTURE_RGBA_ARB, true, 0}; int pbufferFlags[]={WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB, WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB, //request mipmap space if mipmaps are to be used SGIS_generate_mipmap_supported ? WGL_MIPMAP_TEXTURE_ARB : 0, SGIS_generate_mipmap_supported ? true : 0, 0}; if(!pbuffer.Init(pbufferSize, pbufferSize, 32, 24, 8, 1, pbufferExtraIAttribs, pbufferFlags)) return false; //Create the texture object to relate to the pbuffer glGenTextures(1, &pbufferTexture); glBindTexture(GL_TEXTURE_2D, pbufferTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Use generated mipmaps if supported if(SGIS_generate_mipmap_supported) { glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, true); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glHint(GL_GENERATE_MIPMAP_HINT_SGIS, GL_NICEST); useMipmapFilter=true; } //Use maximum anisotropy if supported if(EXT_texture_filter_anisotropic_supported) { glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy); currentAnisotropy=maxAnisotropy; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, currentAnisotropy); } //Load the decal texture //Note: This MUST be done when the pbuffer is the current context pbuffer.MakeCurrent(); IMAGE decalImage; decalImage.Load("decal.bmp"); glGenTextures(1, &decalTexture); glBindTexture(GL_TEXTURE_2D, decalTexture); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, decalImage.width, decalImage.height, 0, decalImage.format, GL_UNSIGNED_BYTE, decalImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //reset timer for start timer.Reset(); return true; }
//Set up variables bool DemoInit() { if(!window.Init("Project Template", 640, 480, 32, 24, 8, WINDOWED_SCREEN)) return 0; //quit if not created SetUpARB_multitexture(); SetUpARB_texture_cube_map(); SetUpEXT_texture_edge_clamp(); SetUpNV_register_combiners(); SetUpNV_register_combiners2(); SetUpNV_vertex_program(); //Check for necessary extensions if( !ARB_multitexture_supported || !ARB_texture_cube_map_supported || !EXT_texture_edge_clamp_supported || !NV_register_combiners_supported || !NV_vertex_program_supported) return false; //Check for single-pass chromatic aberration states GLint maxTextureUnits; glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits); if( NV_register_combiners2_supported && maxTextureUnits>=4) { errorLog.OutputSuccess("Single Pass Chromatic Aberration Supported!"); pathOneSupported=true; renderPath=CHROMATIC_SINGLE; } camera.Init(VECTOR3D(0.0f, 0.0f, 4.0f), 2.5f, 10.0f); if( !cubeMapPosX.Load("cube_face_posx.tga") || !cubeMapNegX.Load("cube_face_negx.tga") || !cubeMapPosY.Load("cube_face_posy.tga") || !cubeMapNegY.Load("cube_face_negy.tga") || !cubeMapPosZ.Load("cube_face_posz.tga") || !cubeMapNegZ.Load("cube_face_negz.tga")) return false; //Build a texture from the data glGenTextures(1, &cubeMapTexture); //Generate Texture ID glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, cubeMapTexture); //Bind texture glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_RGBA8, cubeMapPosX.width, cubeMapPosX.height, 0, cubeMapPosX.format, GL_UNSIGNED_BYTE, cubeMapPosX.data); glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, 0, GL_RGBA8, cubeMapNegX.width, cubeMapNegX.height, 0, cubeMapNegX.format, GL_UNSIGNED_BYTE, cubeMapNegX.data); glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, 0, GL_RGBA8, cubeMapPosY.width, cubeMapPosY.height, 0, cubeMapPosY.format, GL_UNSIGNED_BYTE, cubeMapPosY.data); glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, 0, GL_RGBA8, cubeMapNegY.width, cubeMapNegY.height, 0, cubeMapNegY.format, GL_UNSIGNED_BYTE, cubeMapNegY.data); glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, 0, GL_RGBA8, cubeMapPosZ.width, cubeMapPosZ.height, 0, cubeMapPosZ.format, GL_UNSIGNED_BYTE, cubeMapPosZ.data); glTexImage2D( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, 0, GL_RGBA8, cubeMapNegZ.width, cubeMapNegZ.height, 0, cubeMapNegZ.format, GL_UNSIGNED_BYTE, cubeMapNegZ.data); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); //reset timer for start timer.Reset(); return true; }
///////////////////BSP::LoadTextures//////// //////////////////////////////////////////// bool BSP::LoadTextures(FILE * file) { //Calculate number of textures numTextures=header.directoryEntries[bspTextures].length/sizeof(BSP_LOAD_TEXTURE); //Create space for this many BSP_LOAD_TEXTUREs BSP_LOAD_TEXTURE * loadTextures=new BSP_LOAD_TEXTURE[numTextures]; if(!loadTextures) { errorLog.OutputError("Unable to allocate space for %d BSP_LOAD_TEXTUREs", numTextures); return false; } //Load textures fseek(file, header.directoryEntries[bspTextures].offset, SEEK_SET); fread(loadTextures, 1, header.directoryEntries[bspTextures].length, file); //Create storage space for that many texture identifiers decalTextures=new GLuint[numTextures]; if(!decalTextures) { errorLog.OutputError("Unable to create storage space for %d texture IDs", numTextures); return false; } //Create storage space for that many booleans to tell if texture has loaded isTextureLoaded=new bool[numTextures]; if(!isTextureLoaded) { errorLog.OutputError("Unable to create storage space for %d booleans", numTextures); return false; } //Generate the texture identifiers glGenTextures(numTextures, decalTextures); //Loop through and create textures IMAGE textureImage; //Image used to load textures for(int i=0; i<numTextures; ++i) { glBindTexture(GL_TEXTURE_2D, decalTextures[i]); //add file extension to the name char tgaExtendedName[68]; char jpgExtendedName[68]; strcpy(tgaExtendedName, loadTextures[i].name); strcat(tgaExtendedName, ".tga"); strcpy(jpgExtendedName, loadTextures[i].name); strcat(jpgExtendedName, ".jpg"); //Load texture image bool isJpgTexture=false; //have we loaded a jpg? if(!textureImage.Load(tgaExtendedName)) //try to load .tga, if not { if(LoadJPG(&textureImage, jpgExtendedName)) //try to load jpg { isJpgTexture=true; isTextureLoaded[i]=true; } else isTextureLoaded[i]=false; } else isTextureLoaded[i]=true; //if a jpg texture, need to set UNPACK_ALIGNMENT to 1 if(isJpgTexture) glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //Create texture gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA8, textureImage.width, textureImage.height, textureImage.format, GL_UNSIGNED_BYTE, textureImage.data); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); //Set Parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } if(loadTextures) delete [] loadTextures; loadTextures=NULL; return true; }
//Set up variables bool DemoInit() { //Seed random number generator srand( (unsigned)time( NULL ) ); //Initialise the array of vertices numVertices=gridDensity*gridDensity; vertices=new SIMPLE_VERTEX[numVertices]; if(!vertices) { LOG::Instance()->OutputError("Unable to allocate space for %d vertices", numVertices); return false; } for(int i=0; i<gridDensity; ++i) { for(int j=0; j<gridDensity; ++j) { vertices[i*gridDensity+j].position.Set( (float(i)/(gridDensity-1))*2-1, 0.0f, (float(j)/(gridDensity-1))*2-1); vertices[i*gridDensity+j].normal.Set( 0.0f, 1.0f, 0.0f); vertices[i*gridDensity+j].texCoords.Set( (float(i)/(gridDensity-1)), -(float(j)/(gridDensity-1))); } } //Initialise the indices numIndices=2*(gridDensity)*(gridDensity-1); indices=new GLuint[numIndices]; if(!indices) { LOG::Instance()->OutputError("Unable to allocate space for %d indices", numIndices); return false; } for(int i=0; i<gridDensity-1; ++i) { for(int j=0; j<gridDensity; ++j) { indices[(i*gridDensity+j)*2 ]=(i+1)*gridDensity+j; indices[(i*gridDensity+j)*2+1]=i*gridDensity+j; } } //Load texture IMAGE floorImage; floorImage.Load("OpenGL.tga"); if(floorImage.paletted) floorImage.ExpandPalette(); glGenTextures(1, &floorTexture); glBindTexture(GL_TEXTURE_2D, floorTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA8, floorImage.width, floorImage.height, floorImage.format, GL_UNSIGNED_BYTE, floorImage.data); //Initialise the lights for(int i=0; i<numLights; ++i) { lights[i].position.Set( (float(rand())/RAND_MAX)*2-1, 0.02f, (float(rand())/RAND_MAX)*2-1); lights[i].velocity.Set( (float(rand())/RAND_MAX)*2-1, 0.0f, (float(rand())/RAND_MAX)*2-1); lights[i].color.Set( (float(rand())/RAND_MAX)*0.75f, (float(rand())/RAND_MAX)*0.75f, (float(rand())/RAND_MAX)*0.75f, 1.0f); } //Load vertex programs if(GLEE_NV_vertex_program) { glGenProgramsNV(1, &vp1); glBindProgramNV(GL_VERTEX_PROGRAM_NV, vp1); LoadARB_program(GL_VERTEX_PROGRAM_NV, "vp1.txt"); } if(GLEE_NV_vertex_program2) { glGenProgramsNV(1, &vp2); glBindProgramNV(GL_VERTEX_PROGRAM_NV, vp2); LoadARB_program(GL_VERTEX_PROGRAM_NV, "vp2.txt"); } if(GLEE_NV_vertex_program || GLEE_NV_vertex_program2) { //Track modelview-projection matrix glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV); } //reset timer timer.Reset(); return true; }
//Called for initiation void Init(void) { //Check for and set up extensions // if( !SetUpARB_multitexture() || !SetUpARB_texture_cube_map() || // !SetUpARB_texture_env_combine() || !SetUpARB_texture_env_dot3()) // { // printf("Required Extension Unsupported\n"); // exit(0); // } //Load identity modelview glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //Shading states glShadeModel(GL_SMOOTH); glClearColor(0.2f, 0.4f, 0.2f, 0.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //Depth states glClearDepth(1.0f); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); //Load normal map IMAGE normalMapImage; std::stringstream fn; fn << texture_path; fn << "NormalMap.bmp"; normalMapImage.Load(fn.str().c_str()); // normalMapImage.Load("NormalMap.bmp"); normalMapImage.ExpandPalette(); //Convert normal map to texture glGenTextures(1, &normalMap); glBindTexture(GL_TEXTURE_2D, normalMap); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, normalMapImage.width, normalMapImage.height, 0, normalMapImage.format, GL_UNSIGNED_BYTE, normalMapImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Load decal image IMAGE decalImage; std::stringstream fn_decal; fn_decal << texture_path; fn_decal << "Decal.bmp"; decalImage.Load(fn_decal.str().c_str()); // decalImage.Load("Decal.bmp"); decalImage.ExpandPalette(); //Convert decal image to texture glGenTextures(1, &decalTexture); glBindTexture(GL_TEXTURE_2D, decalTexture); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, decalImage.width, decalImage.height, 0, decalImage.format, GL_UNSIGNED_BYTE, decalImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Create normalisation cube map glGenTextures(1, &normalisationCubeMap); glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normalisationCubeMap); GenerateNormalisationCubeMap(); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); }
//Set up variables bool DemoInit() { SetUpARB_multitexture(); SetUpARB_texture_cube_map(); SetUpEXT_compiled_vertex_array(); SetUpEXT_texture_edge_clamp(); SetUpNV_register_combiners(); SetUpNV_vertex_program(); SetUpNV_texture_shader(); if( !GL_ARB_texture_cube_map || !GL_EXT_compiled_vertex_array || !GL_ARB_multitexture || !GL_NV_register_combiners || !GL_NV_vertex_program || !GL_EXT_texture_edge_clamp) return false; //Get some useful info int maxTextureUnitsARB; glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnitsARB); int maxGeneralCombinersNV; glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &maxGeneralCombinersNV); if( GL_NV_texture_shader && maxTextureUnitsARB>=4 && maxGeneralCombinersNV>=4) { Util::log("Higher Quality bump mapping supported"); paths1And2Supported=true; currentTechnique=TEXTURE_LOOKUP; } else Util::log("Higher Quality bump mapping unsupported"); //Load Textures //normal map - put gloss map in alpha normalMapImage.Load("Normal Map.bmp"); normalMapImage.LoadAlphaTGA("gloss.tga"); glGenTextures(1, &normalMapTexture); glBindTexture(GL_TEXTURE_2D, normalMapTexture); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, normalMapImage.width, normalMapImage.height, 0, normalMapImage.format, GL_UNSIGNED_BYTE, normalMapImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //decal decalImage.Load("Decal.bmp"); glGenTextures(1, &decalTexture); glBindTexture(GL_TEXTURE_2D, decalTexture); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, decalImage.width, decalImage.height, 0, decalImage.format, GL_UNSIGNED_BYTE, decalImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Create normalisation cube map glGenTextures(1, &normalisationCubeMap); glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, normalisationCubeMap); GenerateNormalisationCubeMap(); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); if(paths1And2Supported) { //Create signed normap map //Create space for signed data GLbyte * signedData=new GLbyte[normalMapImage.width*normalMapImage.height*3]; if(!signedData) { Util::log("Unable to allocate memory for signed normal map data"); return false; } //Convert unsigned to signed RGB data, ignoring alpha for(unsigned int i=0; i<normalMapImage.width*normalMapImage.height; i++) { for(unsigned int j=0; j<3; j++) { signedData[i*3+j]=normalMapImage.data[i*4+j]-128; } } glGenTextures(1, &signedNormalMap); glBindTexture(GL_TEXTURE_2D, signedNormalMap); glTexImage2D( GL_TEXTURE_2D, 0, GL_SIGNED_RGBA8_NV, normalMapImage.width, normalMapImage.height, 0, GL_RGB, GL_BYTE, signedData); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); if(signedData) delete [] signedData; signedData=NULL; } //make sure texImage2D is finished with normalMapImage before we change the image glFinish(); //Flatten the bumps in the normal map for(unsigned int i=0; i<normalMapImage.width*normalMapImage.height; ++i) { normalMapImage.data[i*4]=128; normalMapImage.data[i*4+1]=128; normalMapImage.data[i*4+2]=255; } //create flat normal map with gloss map in alpha glGenTextures(1, &flatNormalMap); glBindTexture(GL_TEXTURE_2D, flatNormalMap); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, normalMapImage.width, normalMapImage.height, 0, normalMapImage.format, GL_UNSIGNED_BYTE, normalMapImage.data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); if(paths1And2Supported) { //Create signed flat normap map //Create space for signed data GLbyte * signedData=new GLbyte[normalMapImage.width*normalMapImage.height*3]; if(!signedData) { Util::log("Unable to allocate memory for signed normal map data"); return false; } //Convert unsigned to signed RGB data, ignoring alpha for(unsigned int i=0; i<normalMapImage.width*normalMapImage.height; i++) { for(unsigned int j=0; j<3; j++) { signedData[i*3+j]=normalMapImage.data[i*4+j]-128; } } glGenTextures(1, &signedFlatNormalMap); glBindTexture(GL_TEXTURE_2D, signedFlatNormalMap); glTexImage2D( GL_TEXTURE_2D, 0, GL_SIGNED_RGBA8_NV, normalMapImage.width, normalMapImage.height, 0, GL_RGB, GL_BYTE, signedData); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); if(signedData) delete [] signedData; signedData=NULL; //Create specular ramp texture unsigned char specularRampValues[256]; for(unsigned int i=0; i<256; i++) { double poweredValue=(double)i/255; //raise to 16th power poweredValue= poweredValue*poweredValue*poweredValue*poweredValue* poweredValue*poweredValue*poweredValue*poweredValue* poweredValue*poweredValue*poweredValue*poweredValue* poweredValue*poweredValue*poweredValue*poweredValue; specularRampValues[i] = char(poweredValue*255); } glGenTextures(1, &specularRamp); glBindTexture(GL_TEXTURE_2D, specularRamp); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, 256, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, specularRampValues); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } //reset timer for start timer.Reset(); return true; }