Download presentation
Presentation is loading. Please wait.
Published byNickolas Perry Modified over 9 years ago
1
CH6 Texture
2
Pixel pipeline Vertex pipeline Course Map Transformation & Lighting Primitive assembly Viewport culling & clipping Texture blending Per Fragment operations Buffer operations Rasterizer setup Framebuffer We are here!
3
Before coding … 1/3 Prepare all texture images you need. BMP file is a good choice If you want to load other format, you can try the FreeImage library. Or … just convert image files to BMP files
4
Before coding … 2/3 Add GlAux.Lib into your project.
5
Before coding … 3/3 Prepare a mesh with texture coordinate For simple shapes, you can assign texture coordinate by manually coding. For complex objects Use automatic texture-coordinate generation Or use modeling tools Maya, 3DS Max, Blender…
6
How to use texture? 1/2 Initial Texture Generate Texture glGenTextures(number of textures, texture id array) Bind glBindTexture(GL_TEXTURE_2D, textId); Move Date into Texture glTexImage2D ( … ) or gluBuild2DMipmaps( … ) Set the Options glTexEnv ( … ) glTexParameteri ( … )
7
How to use texture? 2/2 Draw Object with Texture Enable glEnable(GL_TEXTURE_2D); Bind glBindTexture(GL_TEXTURE_2D, textId); Assign texture coordinate for each vertex glTexCoord2f(u, v); glVertex3f(x, y, z); Disable and unbind them when you don’t want to use them on next object.
8
Example Program 1/4 #include #define TEX_NUM 1 //the number of textures you use. #define MIPMAP AUX_RGBImageRec * img; //to save image file GLuint texObject[TEX_NUM]; //texture object
9
Example Program 2/4 void LoadTexture(char* filename){ img = auxDIBImageLoadA(filename); glGenTextures(TEX_NUM, texObject); glBindTexture(GL_TEXTURE_2D, texObject[0]); #ifdef MIPMAP gluBuild2DMipmaps( GL_TEXTURE_2D, 4, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); #else glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, img->sizeX, img->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); }
10
Example Program 3/4 void GL_display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texObject[0]); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-50.0, 0.0, 0.0); glTexCoord2f(0.0, 100.0); glVertex3f(-50.0, 0.0, 100.0); glTexCoord2f(100.0, 100.0); glVertex3f(50.0, 0.0, 100.0); glTexCoord2f(100.0, 0.0); glVertex3f(50.0, 0.0, 0.0); glEnd(); glFlush(); }
11
Example Program 4/4 void GL_reshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.5, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.5, 0.0, 50.0, 0.0, 50.0, 0.0, 1.0, 0.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(400, 400); glutInitWindowPosition(0, 0); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow("Texture"); LoadTexture("check.bmp"); glutDisplayFunc(GL_display); glutReshapeFunc(GL_reshape); glutMainLoop(); }
12
Result Check_old.bmp Width/Height: 256/256
13
Load BMP file AUX_RGBImageRec* auxDIBImageLoadA(char *); Load a BMP file. typedef struct _AUX_RGBImageRec { GLint sizeX, sizeY; unsigned char *data; }; sizeX, sizeY : image width / height. data : A pointer to the image data in memory.
14
Generate Texture Object void glGenTextures( GLsizei n, GLuint *textures ); To generate texture names. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc02_3p6b.asp n: the number of texture names to be generated. textures: pointer to the first element of an array in which the texture are stored. GLboolean glIsTexture( GLuint texture ); To determine if a name corresponds to a texture. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_7cv9.asp
15
Bind texture void glBindTexture( GLenum target, GLuint texture ); To bind the texture to the target. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_3bad.asp target: GL_TEXTURE_1D, GL_TEXTURE_2D void glDeleteTextures( GLsizei n, const GLuint *textures ); Delete named textures. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc01_6vqr.asp
16
Send texture data: glTexImage2D 1/4 void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels );
17
Send texture data: glTexImage2D 2/4 Specifies a 2D texture image http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_16jo.asp target: Must be GL_TEXTURE_2D level: level-of-detail level. It must be 0 if you don ’ t want to use mip-map. internalformat: GL_RGBA and many others … Width / height : image witdh / height
18
Send texture data: glTexImage2D 3/4 border: 0 or 1 0 : no border, image width & height must be power of 2. 1 : use border, image width & height must be power of 2 plus 2.
19
Send texture data: glTexImage2D 4/4 format: format of the image data GL_RGB, GL_RGBA, and many others … type: data type of the image data pixel: A pointer to the image data in memory. (Hint: the BMP file you have loaded … )
20
Texture Setting: glTexEnv 1/3 void glTexEnv{fi}(GLenum target, GLenum pname, GLfloat param ); to indicate how the texels are combined with the original pixels http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_6xyu.asp target: must be GL_TEXTURE_ENV pname: must be GL_TEXTURE_ENV_MODE param: 5 choices, see next page
21
Texture Setting: glTexEnv 2/3 Base Internal Format GL_REPLACEGL_MODULATEGL_ADD GL_ALPHAC = Cf, A = AtC = Cf, A = AfAtC=Cf, A=AfAt GL_LUMINANCEC = Lt, A = AfC = CfLt, A = AfC=Cf+CT, A=Af GL_LUMINANCE_ALPHAC = Lt, A = AtC = CfLt, A = AfAtC=Cf+Ct, A=AfAt GL_INTENSITYC = It, A = ItC = CfIt, A = AfItC=Cf+Ct, A=Af+At GL_RGBC = Ct, A = AfC = CfCt, A = AfC=Cf+Ct, A=Af GL_RGBAC = Ct, A = AtC = CfCt, A = AfAtC=Cf+Ct, A=AfAt Base Internal Format GL_DECALGL_BLEND GL_ALPHAUndefinedC = Cf, A = AfAt GL_LUMINANCEUndefinedC = Cf(1-Lt)+CcLt, A = Af GL_LUMINANCE_ALPHAUndefinedC = Cf(1-Lt)+CcLt, A = AfAt GL_INTENSITYUndefinedC = Cf(1-It)+CcIt, A = Af(1-It)+AcIt GL_RGBC = Ct, A = AfC = Cf(1-Ct)+CcCt, A = Af GL_RGBAC = Cf(1-At)+CtAt, A = AtC = Cf(1-Ct)+CcCt, A = AfAt Ct = color of texture, At = alpha of texture Cf = color of frame buffer, Af = alpha of frame buffer
22
Texture Setting: glTexEnv 3/3 glTexEnv{fi}v(GLenum target, GLenum pname, const GLfloat *params ) target: must be GL_TEXTURE_ENV pname: GL_TEXTURE_ENV_COLOR or GL_TEXTURE_ENV_MODE params: if pname is GL_TEXTURE_ENV_MODE : A pointer to an array of parameters.( GL_MODULATE, GL_DECAL, and GL_BLEND ) if pname is GL_TEXTURE_ENV_COLOR: a pointer to an array of R, G, B, A
23
Texture parameter 1/5 glTexParameter{if}(GLenum target, GLenum pname, GLfloat param ) Set texture parameters. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_9upe.asp target: GL_TEXTURE_1D, GL_TEXTURE_2D pname / param: see next page
24
Texture parameter 2/5 pnameparam GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_TGL_REPEAT, GL_CLAMP GL_TEXTURE_MAG_FILTER GL_TEXTURE_MIN_FILTERGL_NEAREST, GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST GL_TEXTURE_BORDER_COLORcolor value
25
Texture parameter 3/5 WRAP Repeat both S, T Clamp both S, T Repeat T but Clamp S
26
Texture parameter 4/5 MAG filter When the pixel being textured maps to an area less than or equal to one texture element MIN filter When the pixel being textured maps to an area greater then one texture element
27
Texture parameter 5/5 GL_NEARST pixel texel GL_LINEAR Get average color... GL_NEAREST_MIPMAP_XXXXXX Find the most closely match mipmap GL_LINEAR_MIPMAP_XXXXXXX Find the most 2 closely match mipmap and get average.
28
Build mip-maps 1/3 int gluBuild2DMipmaps( GLenum target, GLint components, GLint width, GLint height, GLenum format, GLenum type, const void *data ); http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glufnc01_406r.asp
29
Build mip-maps 2/3 target : Must be GL_TEXTURE_2D. components :The number of color components in the texture. Must be 1, 2, 3, or 4. width, height :width / height of image. format : GL_RGB, GL_RGBA and many others … type :The data type for data data :A pointer to the image data in memory.
30
Build mip-maps 3/3 without mip-map with mip-map
31
Automatic Texture Coordinate Generation No need to use glTexCoord Four types Sphere Object plane Eye plane Cube
32
Sphere environment.bmp Width/Height: 128/128
35
Object plane -1 S = 1.0 x + 0.0 y + 0.0 z + 0.0 w T = 0.0 x + 1.0 y + 0.0 z + 0.0 w xyz in world space
36
Object plane -2 S = 1.0 x + 0.0 y + 0.0 z + 0.0 w T = 0.0 x + 2.0 y + 0.0 z + 0.0 w xyz in world space
37
Eye plane S = 1.0 x + 0.0 y + 0.0 z + 0.0 w T = 0.0 x + 1.0 y + 0.0 z + 0.0 w xyz in eye space
38
Sphere Example 1/3 #include AUX_RGBImageRec * img; GLuint texObject; void LoadTexture(char* filename){ img = auxDIBImageLoad(filename); glGenTextures(1, &texObject); glBindTexture(GL_TEXTURE_2D, texObject); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); }
39
Sphere Example 2/3 void GL_display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glColor3f(1.0, 1.0, 1.0); glutSolidTeapot(18); glFlush(); } void GL_reshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLfloat)w/(GLfloat)h, 0.5, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 50.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); }
40
Sphere Example 3/3 int main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(400, 400); glutInitWindowPosition(0, 0); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow("Texture"); LoadTexture("environment.bmp"); glutDisplayFunc(GL_display); glutReshapeFunc(GL_reshape); glutMainLoop(); }
41
Object Plane Example void LoadTexture(char* filename) { float params1[] = {1.0, 0.0, 0.0,0.0}; float params2[] = {0.0, 1.0, 0.0,0.0}; img = auxDIBImageLoad(filename); glGenTextures(1, &texObject); glBindTexture(GL_TEXTURE_2D, texObject); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB,GL_UNSIGNED_BYTE, img->data); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_S, GL_OBJECT_PLANE, params1); glTexGenfv(GL_T, GL_OBJECT_PLANE, params2); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); }
42
Eye Plane Example void LoadTexture(char* filename) { float params1[] = {1.0, 0.0, 0.0,0.0}; float params2[] = {0.0, 1.0, 0.0,0.0}; img = auxDIBImageLoad(filename); glGenTextures(1, &texObject); glBindTexture(GL_TEXTURE_2D, texObject); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img->sizeX, img->sizeY, GL_RGB,GL_UNSIGNED_BYTE, img->data); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_S, GL_EYE_PLANE, params1); glTexGenfv(GL_T, GL_EYE_PLANE, params2); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_2D); }
43
Cube
44
Result Reflection Normal
45
Cube Example Bind Once, send six images. glBindTexture(GL_TEXTURE_CUBE_MAP, id); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image1); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image2); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image3); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image4); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image5); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, imageSize, imageSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image6); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
46
Texture Coordinate glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_CUBE_MAP); //draw your objects
47
Automatic Texture-Coordinate Generation glTexGen{dfi}(GLenum coord, GLenum pname, GLdouble param); control the generation of texture coordinates http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_73u6.asp coord: GL_S, GL_T, GL_R, or GL_Q. pname: must be GL_TEXTURE_GEN_MODE. param: GL_OBJECT_LINEAR, GL_EYE_LINEAR, or GL_SPHERE_MAP
48
Automatic Texture-Coordinate Generation glTexGen{dfi}v(GLenum coord, GLenum pname, const GLdouble *params ); coord: GL_S, GL_T, GL_R, or GL_Q. pname: GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, or GL_EYE_PLANE … params: the array of texture generation parameters, if pname is GL_OBJECT_PLANE, or GL_EYE_PLANE. *Generated plane = p1X + p2Y + p3Z + p4W
49
Multi-texture Op 0 Op 1 Op 2 Op n glActiveTexture( GL_TEXTURE0 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); Pixel Color final color glActiveTexture( GL_TEXTURE1 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); glActiveTexture( GL_TEXTURE2 ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …); glActiveTexture( GL_TEXTUREn ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, …);
50
Texture Channel void glActiveTexture(GLenum texture) Parameter: GL_TEXTURE0 ~ GL_MAX_TEXTURE_UNITS – 1 Choose channel before binding texture Bind 0 => Disable the chosen channel
51
Operation glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, operation); Operation GL_MODULATE / GL_ADD or /... / GL_SUBTRACT
52
Multiple Texture Coordinate glMultiTexCoord2fARB(GLenum target, GLshort s, GLshort t); Target GL_TEXTURE0 ~ GL_MAX_TEXTURE_UNITS – 1 s, t The texture coordinate of vertex Set the texture coordinate before calling glVertex You need the glew libraray. The setting of glew is similar to the glaux
53
Example #include "glew.h" #include "glaux.h" #include "glut.h“ #define TEX_NUM 2 void reshape(GLsizei w, GLsizei h); void display(); int main(int argc, char** argv){ glutInit(&argc, argv); glutInitWindowSize(400, 400); glutInitWindowPosition(0, 0); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow("Texture"); glewInit(); glGenTextures(TEX_NUM, texObject); LoadTexture(“FirstTexture.bmp", 0); LoadTexture("SecondTexture.bmp", 1); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
54
void LoadTexture(char* filename, int index) { img = auxDIBImageLoadA(filename); glBindTexture(GL_TEXTURE_2D, texObject[index]); #ifdef MIPMAP gluBuild2DMipmaps(GL_TEXTURE_2D, 4, img->sizeX, img->sizeY, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); #else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->sizeX, img->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, img->data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif }
55
void display() { glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); //bind texture 0 glActiveTexture(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texObject[0]); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); //bind texture 1 glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texObject[1]); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
56
glBegin(GL_QUADS); glColor3f(1.0, 1.0, 1.0) glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0); glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0); glVertex3f(-1.0, -1.0, 0.0); glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0); glMultiTexCoord2f(GL_TEXTURE1, 3.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0); glMultiTexCoord2f(GL_TEXTURE1, 3.0, 3.0); glVertex3f(1.0, 1.0, 0.0); glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0); glMultiTexCoord2f(GL_TEXTURE1, 0.0, 3.0); glVertex3f(-1.0, 1.0, 0.0); glEnd();
57
//unbind texture 1 glActiveTexture(GL_TEXTURE1); glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); //unbind texture 0 glActiveTexture(GL_TEXTURE0); glDisable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); glFlush(); }
58
void reshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
59
Result 1 st texture2 nd textureResult
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.