Clone of mesa.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /**
  2. * Test noise() functions.
  3. * 28 Jan 2007
  4. */
  5. #include <assert.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <math.h>
  10. #include <GL/gl.h>
  11. #include <GL/glut.h>
  12. #include <GL/glext.h>
  13. #include "extfuncs.h"
  14. #include "shaderutil.h"
  15. static const char *VertShaderText =
  16. "void main() {\n"
  17. " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
  18. " gl_TexCoord[0] = gl_MultiTexCoord0;\n"
  19. "}\n";
  20. static const char *FragShaderText =
  21. "uniform vec4 Scale, Bias;\n"
  22. "uniform float Slice;\n"
  23. "void main()\n"
  24. "{\n"
  25. " vec4 scale = vec4(5.0);\n"
  26. " vec4 p;\n"
  27. " p.xy = gl_TexCoord[0].xy;\n"
  28. " p.z = Slice;\n"
  29. " vec4 n = noise4(p * scale);\n"
  30. " gl_FragColor = n * Scale + Bias;\n"
  31. "}\n";
  32. static struct uniform_info Uniforms[] = {
  33. { "Scale", 4, GL_FLOAT, { 0.5, 0.4, 0.0, 0}, -1 },
  34. { "Bias", 4, GL_FLOAT, { 0.5, 0.3, 0.0, 0}, -1 },
  35. { "Slice", 1, GL_FLOAT, { 0.5, 0, 0, 0}, -1 },
  36. END_OF_UNIFORMS
  37. };
  38. /* program/shader objects */
  39. static GLuint fragShader;
  40. static GLuint vertShader;
  41. static GLuint program;
  42. static GLint win = 0;
  43. static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
  44. static GLfloat Slice = 0.0;
  45. static GLboolean Anim = GL_FALSE;
  46. static void
  47. Idle(void)
  48. {
  49. Slice += 0.01;
  50. glutPostRedisplay();
  51. }
  52. static void
  53. Redisplay(void)
  54. {
  55. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  56. glUniform1fv_func(Uniforms[2].location, 1, &Slice);
  57. glPushMatrix();
  58. glRotatef(xRot, 1.0f, 0.0f, 0.0f);
  59. glRotatef(yRot, 0.0f, 1.0f, 0.0f);
  60. glRotatef(zRot, 0.0f, 0.0f, 1.0f);
  61. glBegin(GL_POLYGON);
  62. glTexCoord2f(0, 0); glVertex2f(-2, -2);
  63. glTexCoord2f(1, 0); glVertex2f( 2, -2);
  64. glTexCoord2f(1, 1); glVertex2f( 2, 2);
  65. glTexCoord2f(0, 1); glVertex2f(-2, 2);
  66. glEnd();
  67. glPopMatrix();
  68. glutSwapBuffers();
  69. }
  70. static void
  71. Reshape(int width, int height)
  72. {
  73. glViewport(0, 0, width, height);
  74. glMatrixMode(GL_PROJECTION);
  75. glLoadIdentity();
  76. glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
  77. glMatrixMode(GL_MODELVIEW);
  78. glLoadIdentity();
  79. glTranslatef(0.0f, 0.0f, -15.0f);
  80. }
  81. static void
  82. CleanUp(void)
  83. {
  84. glDeleteShader_func(fragShader);
  85. glDeleteShader_func(vertShader);
  86. glDeleteProgram_func(program);
  87. glutDestroyWindow(win);
  88. }
  89. static void
  90. Key(unsigned char key, int x, int y)
  91. {
  92. const GLfloat step = 0.01;
  93. (void) x;
  94. (void) y;
  95. switch(key) {
  96. case 'a':
  97. Anim = !Anim;
  98. glutIdleFunc(Anim ? Idle : NULL);
  99. case 's':
  100. Slice -= step;
  101. break;
  102. case 'S':
  103. Slice += step;
  104. break;
  105. case 'z':
  106. zRot -= 1.0;
  107. break;
  108. case 'Z':
  109. zRot += 1.0;
  110. break;
  111. case 27:
  112. CleanUp();
  113. exit(0);
  114. break;
  115. }
  116. glutPostRedisplay();
  117. }
  118. static void
  119. SpecialKey(int key, int x, int y)
  120. {
  121. const GLfloat step = 3.0f;
  122. (void) x;
  123. (void) y;
  124. switch(key) {
  125. case GLUT_KEY_UP:
  126. xRot -= step;
  127. break;
  128. case GLUT_KEY_DOWN:
  129. xRot += step;
  130. break;
  131. case GLUT_KEY_LEFT:
  132. yRot -= step;
  133. break;
  134. case GLUT_KEY_RIGHT:
  135. yRot += step;
  136. break;
  137. }
  138. glutPostRedisplay();
  139. }
  140. static void
  141. Init(void)
  142. {
  143. if (!ShadersSupported())
  144. exit(1);
  145. GetExtensionFuncs();
  146. vertShader = CompileShaderText(GL_VERTEX_SHADER, VertShaderText);
  147. fragShader = CompileShaderText(GL_FRAGMENT_SHADER, FragShaderText);
  148. program = LinkShaders(vertShader, fragShader);
  149. glUseProgram_func(program);
  150. InitUniforms(program, Uniforms);
  151. assert(glGetError() == 0);
  152. glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
  153. printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
  154. assert(glIsProgram_func(program));
  155. assert(glIsShader_func(fragShader));
  156. assert(glIsShader_func(vertShader));
  157. glColor3f(1, 0, 0);
  158. }
  159. int
  160. main(int argc, char *argv[])
  161. {
  162. glutInit(&argc, argv);
  163. glutInitWindowPosition( 0, 0);
  164. glutInitWindowSize(400, 400);
  165. glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  166. win = glutCreateWindow(argv[0]);
  167. glutReshapeFunc(Reshape);
  168. glutKeyboardFunc(Key);
  169. glutSpecialFunc(SpecialKey);
  170. glutDisplayFunc(Redisplay);
  171. Init();
  172. glutMainLoop();
  173. return 0;
  174. }