/books/article/OpenGL_Basic/code/010_mipmap/main.c

https://github.com/kasicass/kasicass · C · 215 lines · 164 code · 41 blank · 10 comment · 20 complexity · e5e24ede307f0ae4f5339a22d25b57ba MD5 · raw file

  1. // simple texture
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5. #include <SDL/SDL.h>
  6. #include <GL/gl.h>
  7. #include <GL/glu.h>
  8. //------------------------------------------------------------------------------
  9. // my demo
  10. #define SCREEN_WIDTH 640
  11. #define SCREEN_HEIGHT 480
  12. GLubyte mipmap32[32][32][4];
  13. GLubyte mipmap16[16][16][4];
  14. GLubyte mipmap8[8][8][4];
  15. GLubyte mipmap4[4][4][4];
  16. GLubyte mipmap2[2][2][2];
  17. GLubyte mipmap1[1][1][4];
  18. GLuint texName;
  19. //
  20. // Init GL
  21. //
  22. void InitTexture(void)
  23. {
  24. int i, j;
  25. for ( i = 0; i < 32; i++ )
  26. {
  27. for ( j = 0; j < 32; j++ )
  28. {
  29. mipmap32[i][j][0] = 255;
  30. mipmap32[i][j][1] = 255;
  31. mipmap32[i][j][2] = 0;
  32. mipmap32[i][j][3] = 255;
  33. }
  34. }
  35. for ( i = 0; i < 16; i++ )
  36. {
  37. for ( j = 0; j < 16; j++ )
  38. {
  39. mipmap16[i][j][0] = 255;
  40. mipmap16[i][j][1] = 0;
  41. mipmap16[i][j][2] = 255;
  42. mipmap16[i][j][3] = 255;
  43. }
  44. }
  45. for ( i = 0; i < 8; i++ )
  46. {
  47. for ( j = 0; j < 8; j++ )
  48. {
  49. mipmap8[i][j][0] = 255;
  50. mipmap8[i][j][1] = 0;
  51. mipmap8[i][j][2] = 0;
  52. mipmap8[i][j][3] = 255;
  53. }
  54. }
  55. for ( i = 0; i < 4; i++ )
  56. {
  57. for ( j = 0; j < 4; j++ )
  58. {
  59. mipmap4[i][j][0] = 0;
  60. mipmap4[i][j][1] = 255;
  61. mipmap4[i][j][2] = 0;
  62. mipmap4[i][j][3] = 255;
  63. }
  64. }
  65. for ( i = 0; i < 2; i++ )
  66. {
  67. for ( j = 0; j < 2; j++ )
  68. {
  69. mipmap2[i][j][0] = 0;
  70. mipmap2[i][j][1] = 0;
  71. mipmap2[i][j][2] = 255;
  72. mipmap2[i][j][3] = 255;
  73. }
  74. }
  75. mipmap1[i][j][0] = 255;
  76. mipmap1[i][j][1] = 255;
  77. mipmap1[i][j][2] = 255;
  78. mipmap1[i][j][3] = 255;
  79. }
  80. void InitGL(void)
  81. {
  82. // set camera
  83. glViewport(0, 0, (GLsizei) SCREEN_WIDTH, (GLsizei) SCREEN_HEIGHT);
  84. glMatrixMode(GL_PROJECTION);
  85. glLoadIdentity();
  86. gluPerspective(60.0, (GLfloat) SCREEN_WIDTH / (GLfloat) SCREEN_HEIGHT, 1.0, 7000.0);
  87. glMatrixMode(GL_MODELVIEW);
  88. glLoadIdentity();
  89. glTranslatef(0.0, 0.0, -3.6);
  90. glClearColor(0.5, 0.5, 0.5, 0.0);
  91. glShadeModel(GL_FLAT);
  92. glEnable(GL_DEPTH_TEST);
  93. InitTexture();
  94. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  95. glGenTextures(1, &texName);
  96. glBindTexture(GL_TEXTURE_2D, texName);
  97. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  98. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  99. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  100. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
  101. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmap32);
  102. glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmap16);
  103. glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmap8);
  104. glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmap4);
  105. glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmap2);
  106. glTexImage2D(GL_TEXTURE_2D, 5, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipmap1);
  107. }
  108. void RenderScene(void)
  109. {
  110. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  111. glEnable(GL_TEXTURE_2D);
  112. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  113. glBindTexture(GL_TEXTURE_2D, texName);
  114. glBegin(GL_QUADS);
  115. glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
  116. glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);
  117. glTexCoord2f(1.0, 1.0); glVertex3f(2000.0, 1.0, -6000.0);
  118. glTexCoord2f(1.0, 0.0); glVertex3f(2000.0, -1.0, -6000.0);
  119. glEnd();
  120. glFlush();
  121. glDisable(GL_TEXTURE_2D);
  122. }
  123. void kbd_event(int sym)
  124. {
  125. switch (sym)
  126. {
  127. default:
  128. break;
  129. }
  130. }
  131. //------------------------------------------------------------------------------
  132. // main loop
  133. int main(int argc, char *argv[])
  134. {
  135. if (SDL_Init(SDL_INIT_VIDEO) != 0)
  136. {
  137. printf("Unable to init SDL: %s\n", SDL_GetError());
  138. exit(EXIT_FAILURE);
  139. }
  140. atexit(SDL_Quit);
  141. SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  142. SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
  143. SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
  144. SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
  145. if (SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, SDL_OPENGL) == NULL)
  146. {
  147. printf("Unable to set video mode: %s\n", SDL_GetError());
  148. exit(EXIT_FAILURE);
  149. }
  150. SDL_WM_SetCaption("SDL - OpenGl framework", "OpenGL");
  151. InitGL();
  152. // game loop
  153. bool loopcontinue = true;
  154. SDL_Event event;
  155. while (loopcontinue)
  156. {
  157. while (SDL_PollEvent(&event))
  158. {
  159. switch (event.type)
  160. {
  161. case SDL_KEYDOWN:
  162. if (event.key.keysym.sym == SDLK_ESCAPE)
  163. loopcontinue = false;
  164. kbd_event(event.key.keysym.sym);
  165. break;
  166. case SDL_QUIT:
  167. loopcontinue = false;
  168. break;
  169. }
  170. }
  171. RenderScene();
  172. SDL_GL_SwapBuffers();
  173. }
  174. }