Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /**
  2. * "Mandelbrot" shader demo. Uses the example shaders from
  3. * chapter 15 (or 18) of the OpenGL Shading Language "orange" book.
  4. * 15 Jan 2007
  5. */
  6. #include <assert.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <math.h>
  11. #include <GL/gl.h>
  12. #include <GL/glut.h>
  13. #include <GL/glext.h>
  14. #include "extfuncs.h"
  15. #include "shaderutil.h"
  16. static char *FragProgFile = "CH18-mandel.frag.txt";
  17. static char *VertProgFile = "CH18-mandel.vert.txt";
  18. /* program/shader objects */
  19. static GLuint fragShader;
  20. static GLuint vertShader;
  21. static GLuint program;
  22. static struct uniform_info Uniforms[] = {
  23. /* vert */
  24. { "LightPosition", 3, GL_FLOAT, { 0.1, 0.1, 9.0, 0}, -1 },
  25. { "SpecularContribution", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 },
  26. { "DiffuseContribution", 1, GL_FLOAT, { 0.5, 0, 0, 0 }, -1 },
  27. { "Shininess", 1, GL_FLOAT, { 20.0, 0, 0, 0 }, -1 },
  28. /* frag */
  29. { "MaxIterations", 1, GL_FLOAT, { 12, 0, 0, 0 }, -1 },
  30. { "Zoom", 1, GL_FLOAT, { 0.125, 0, 0, 0 }, -1 },
  31. { "Xcenter", 1, GL_FLOAT, { -1.5, 0, 0, 0 }, -1 },
  32. { "Ycenter", 1, GL_FLOAT, { .005, 0, 0, 0 }, -1 },
  33. { "InnerColor", 3, GL_FLOAT, { 1, 0, 0, 0 }, -1 },
  34. { "OuterColor1", 3, GL_FLOAT, { 0, 1, 0, 0 }, -1 },
  35. { "OuterColor2", 3, GL_FLOAT, { 0, 0, 1, 0 }, -1 },
  36. END_OF_UNIFORMS
  37. };
  38. static GLint win = 0;
  39. static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
  40. static GLint uZoom, uXcenter, uYcenter;
  41. static GLfloat zoom = 1.0, xCenter = -1.5, yCenter = 0.0;
  42. static void
  43. Redisplay(void)
  44. {
  45. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  46. /* set interactive uniform parameters */
  47. glUniform1fv_func(uZoom, 1, &zoom);
  48. glUniform1fv_func(uXcenter, 1, &xCenter);
  49. glUniform1fv_func(uYcenter, 1, &yCenter);
  50. glPushMatrix();
  51. glRotatef(xRot, 1.0f, 0.0f, 0.0f);
  52. glRotatef(yRot, 0.0f, 1.0f, 0.0f);
  53. glRotatef(zRot, 0.0f, 0.0f, 1.0f);
  54. glBegin(GL_POLYGON);
  55. glTexCoord2f(0, 0); glVertex2f(-1, -1);
  56. glTexCoord2f(1, 0); glVertex2f( 1, -1);
  57. glTexCoord2f(1, 1); glVertex2f( 1, 1);
  58. glTexCoord2f(0, 1); glVertex2f(-1, 1);
  59. glEnd();
  60. glPopMatrix();
  61. glFinish();
  62. glFlush();
  63. glutSwapBuffers();
  64. }
  65. static void
  66. Reshape(int width, int height)
  67. {
  68. glViewport(0, 0, width, height);
  69. glMatrixMode(GL_PROJECTION);
  70. glLoadIdentity();
  71. glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
  72. glMatrixMode(GL_MODELVIEW);
  73. glLoadIdentity();
  74. glTranslatef(0.0f, 0.0f, -6.0f);
  75. }
  76. static void
  77. CleanUp(void)
  78. {
  79. glDeleteShader_func(fragShader);
  80. glDeleteShader_func(vertShader);
  81. glDeleteProgram_func(program);
  82. glutDestroyWindow(win);
  83. }
  84. static void
  85. Key(unsigned char key, int x, int y)
  86. {
  87. (void) x;
  88. (void) y;
  89. switch(key) {
  90. case 'z':
  91. zoom *= 0.9;
  92. break;
  93. case 'Z':
  94. zoom /= 0.9;
  95. break;
  96. case 27:
  97. CleanUp();
  98. exit(0);
  99. break;
  100. }
  101. glutPostRedisplay();
  102. }
  103. static void
  104. SpecialKey(int key, int x, int y)
  105. {
  106. const GLfloat step = 0.1 * zoom;
  107. (void) x;
  108. (void) y;
  109. switch(key) {
  110. case GLUT_KEY_UP:
  111. yCenter += step;
  112. break;
  113. case GLUT_KEY_DOWN:
  114. yCenter -= step;
  115. break;
  116. case GLUT_KEY_LEFT:
  117. xCenter -= step;
  118. break;
  119. case GLUT_KEY_RIGHT:
  120. xCenter += step;
  121. break;
  122. }
  123. glutPostRedisplay();
  124. }
  125. static void
  126. Init(void)
  127. {
  128. if (!ShadersSupported())
  129. exit(1);
  130. GetExtensionFuncs();
  131. vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile);
  132. fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile);
  133. program = LinkShaders(vertShader, fragShader);
  134. glUseProgram_func(program);
  135. InitUniforms(program, Uniforms);
  136. uZoom = glGetUniformLocation_func(program, "Zoom");
  137. uXcenter = glGetUniformLocation_func(program, "Xcenter");
  138. uYcenter = glGetUniformLocation_func(program, "Ycenter");
  139. assert(glGetError() == 0);
  140. glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
  141. printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
  142. assert(glIsProgram_func(program));
  143. assert(glIsShader_func(fragShader));
  144. assert(glIsShader_func(vertShader));
  145. glColor3f(1, 0, 0);
  146. }
  147. static void
  148. ParseOptions(int argc, char *argv[])
  149. {
  150. int i;
  151. for (i = 1; i < argc; i++) {
  152. if (strcmp(argv[i], "-fs") == 0) {
  153. FragProgFile = argv[i+1];
  154. }
  155. else if (strcmp(argv[i], "-vs") == 0) {
  156. VertProgFile = argv[i+1];
  157. }
  158. }
  159. }
  160. int
  161. main(int argc, char *argv[])
  162. {
  163. glutInit(&argc, argv);
  164. glutInitWindowPosition( 0, 0);
  165. glutInitWindowSize(400, 400);
  166. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  167. win = glutCreateWindow(argv[0]);
  168. glutReshapeFunc(Reshape);
  169. glutKeyboardFunc(Key);
  170. glutSpecialFunc(SpecialKey);
  171. glutDisplayFunc(Redisplay);
  172. ParseOptions(argc, argv);
  173. Init();
  174. glutMainLoop();
  175. return 0;
  176. }