diff options
-rw-r--r-- | fiz/naloga/gl/fragment.glsl | 73 | ||||
-rw-r--r-- | fiz/naloga/gl/helmholtz.c | 48 | ||||
-rw-r--r-- | fiz/naloga/gl/vertex.glsl | 10 |
3 files changed, 127 insertions, 4 deletions
diff --git a/fiz/naloga/gl/fragment.glsl b/fiz/naloga/gl/fragment.glsl index e69de29..c4952c4 100644 --- a/fiz/naloga/gl/fragment.glsl +++ b/fiz/naloga/gl/fragment.glsl @@ -0,0 +1,73 @@ +#version 330 +#pragma optionNV (unroll 1) + +#define show_vec + +#define SEG 32 + +#define R .8 +#define I .5 +#define n 100. + +#define PI 3.1415 + +in vec2 UVo; + +uniform float time; +uniform int OPTIONS; + +out vec4 fragColor; + +vec3 tuljava (vec3 pz) { + float dr = 2. * PI / float(SEG); + vec3 sum = vec3(0); + for (int i = 0; i < SEG; i++){ + float theta = dr * float(i); + // jebi se, zakaj neza? pisat ?ita linearno >:( + vec3 dl = vec3(0,cos(theta),-sin(theta))*dr*R; + vec3 r = vec3(0,sin(theta),cos(theta))*R; + r+=pz; + sum+=cross(dl,r)/(length(r)*length(r)*length(r)); + } + sum *= 1e-6; + return sum; +} + +void main () { + vec2 uv = UVo; + vec3 poz = vec3(uv*2.,sin(time/10.)*R); + vec3 offset = vec3(R/2.,0,0); + + vec3 rez = tuljava(poz+offset)*n*I + + tuljava(poz-offset)*n*I; + rez *= 1000.; +#ifdef show_vec + fragColor = vec4(rez, 1); +#else + fragColor = vec4(vec3(length(rez)), 1); +#endif +} +/* + uniform float time; + uform int OPTIONS; +//uniform mat2 bounds; + +out vec4 frag_colour; + + +void main() { +vec2 UV = UVo; +float scale = 1.1; +vec2 complex=UV*scale; +vec2 ot=vec2(0); +int tmpy=OPTIONS; +for (int x = 0; x < 16; x++){ +ot=vec2(complex.x*ot.x-complex.y*ot.y,complex.x*ot.y+complex.y*ot.x); +int swch = tmpy & 1; +ot+=complex * (swch*2-1); +tmpy>>=1; +} + +frag_colour = vec4(vec3(smoothstep(.05,0,length(ot))), 1.); +} + */ diff --git a/fiz/naloga/gl/helmholtz.c b/fiz/naloga/gl/helmholtz.c index 7d8171b..cbc1db3 100644 --- a/fiz/naloga/gl/helmholtz.c +++ b/fiz/naloga/gl/helmholtz.c @@ -41,11 +41,37 @@ int main (void) { glfwSwapInterval(1); // vsync glfwSetKeyCallback(okno, key_callback); GLuint program = glCreateProgram(); + float points[] = { + -1.0f, 1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f + }; + // <black box> + GLuint points_vbo, vao; + glGenBuffers(1, &points_vbo); + glBindBuffer(GL_ARRAY_BUFFER, points_vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof points, points, GL_STATIC_DRAW); + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, points_vbo); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); + // </black box> + const char * vertex = _binary_vertex_glsl_start; + const char * fragment = _binary_fragment_glsl_start; #define DO_SHADER(whi, WHI) \ + fprintf(stderr, "shader code:\n%.*s\n", whi##_len, whi); \ + fprintf(stderr, "glCreateShader ...\n"); \ GLuint whi##_shader = glCreateShader(GL_##WHI##_SHADER); \ - glShaderSource(whi##_shader, 1, (const GLchar **) &_binary_##whi##_glsl_start, &whi##_len); \ + fprintf(stderr, "glShaderSource ...\n"); \ + glShaderSource(whi##_shader, 1, &whi, &whi##_len); \ + fprintf(stderr, "glCompileShader ...\n"); \ glCompileShader(whi##_shader); \ GLint whi##_success = 0; \ + fprintf(stderr, "glGetShaderiv ...\n"); \ glGetShaderiv(whi##_shader, GL_COMPILE_STATUS, &whi##_success); \ if (whi##_success == GL_FALSE) { \ GLint logSize = 0; \ @@ -59,6 +85,9 @@ int main (void) { glAttachShader(program, whi##_shader); DO_SHADER(vertex, VERTEX); DO_SHADER(fragment, FRAGMENT); + // <black box> + glBindAttribLocation(program, 0, "vertex_position"); + // </black box> glLinkProgram(program); GLint isLinked = 0; glGetProgramiv(program, GL_LINK_STATUS, &isLinked); @@ -73,13 +102,24 @@ int main (void) { glDeleteProgram(program); return 5; } - glDetachShader(program, vertex_shader); // TODO: ali lahko glDeleteShader po linku? - glDetachShader(program, fragment_shader); + // glDetachShader(program, vertex_shader); + // glDetachShader(program, fragment_shader); + // glDeleteShader(fragment_shader); // testiraj, mogoče se to sme + // glDeleteShader(vertex_shader); + GLuint timeI = glGetUniformLocation(program, "time"); + GLuint optI = glGetUniformLocation(program, "OPTIONS"); + uint32_t opts = 123456; + glClearColor(0.1, 0.2, 0.3, 1); while (!glfwWindowShouldClose(okno)) { int w, h; glfwGetFramebufferSize(okno, &w, &h); glViewport(0, 0, w, h); - + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(program); // testiraj, mogoče se to sme dat iz loopa gor + glUniform1f(timeI, glfwGetTime()); + glUniform1i(optI, opts++); + glBindVertexArray(vao); + glDrawArrays(GL_TRIANGLES, 0, 6 /* dva triangla po 3 */); glfwSwapBuffers(okno); glfwWaitEvents(); // glfwPollEvents pa returna takoj } diff --git a/fiz/naloga/gl/vertex.glsl b/fiz/naloga/gl/vertex.glsl index e69de29..d17b522 100644 --- a/fiz/naloga/gl/vertex.glsl +++ b/fiz/naloga/gl/vertex.glsl @@ -0,0 +1,10 @@ +#version 330 + +layout(location = 0) in vec3 vertex_position; + +out vec2 UVo; + +void main() { + UVo = vertex_position.xy; + gl_Position = vec4(vertex_position, 1.0); +} |