summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.ch>2017-07-18 16:45:28 +0200
committerChristoph Helma <helma@in-silico.ch>2017-07-18 16:45:28 +0200
commitceca3527ef89f4b6eea14b1fcc4c68d0b235778f (patch)
tree4222bcf9b68c0bca76cefc7bc4f6d1dffcc0abce
parent7fc650cc1375a96adf6f2ba7d0874228a4780752 (diff)
multiple textures
-rw-r--r--shader.frag19
-rw-r--r--sv.c110
2 files changed, 89 insertions, 40 deletions
diff --git a/shader.frag b/shader.frag
index 2084f1c..53db428 100644
--- a/shader.frag
+++ b/shader.frag
@@ -1,3 +1,4 @@
+#version 330 core
 #ifdef GL_ES
 precision mediump float;
 #endif
@@ -7,9 +8,10 @@ uniform float time;
 uniform float m;
 //uniform sampler2D backbuffer;
 
-uniform sampler2D image1;
-uniform sampler2D image2;
-uniform sampler2D image3;
+uniform sampler2D img0;
+uniform sampler2D img1;
+uniform sampler2D img2;
+uniform sampler2D img3;
 //uniform vec2 u_tex0Resolution;
 
 float random (in float x) {
@@ -18,8 +20,13 @@ float random (in float x) {
 
 void main (void) {
 	vec2 st = gl_FragCoord.xy/resolution.xy;
-  vec4 i1 = texture2D(image1,st*0.8);
-  vec4 i2 = texture2D(image2,st);
-	gl_FragColor = mix(i1,i2,m);
+  vec4 i1 = texture2D(img0,st*0.8);
+  vec4 i2 = texture2D(img1,st);
+  vec4 i3 = texture2D(img2,st*1.2);
+  vec4 i4 = texture2D(img3,st);
+	i1 = mix(i1,i2,sin(time));
+	i2 = mix(i3,i4,cos(time));
+	//gl_FragColor = mix(i1,i2,0.5);
+	gl_FragColor = i1;
   //gl_FragColor = texture2D(image1,st*sin(time*2.));
 }
diff --git a/sv.c b/sv.c
index 6d8ab3e..e30942e 100644
--- a/sv.c
+++ b/sv.c
@@ -16,12 +16,7 @@ GLFWwindow* window;
 GLuint vertex;
 GLuint fragment;
 GLuint shader;
-
-struct texture {
-  char name[10];
-  GLuint id;
-  UT_hash_handle hh;         /* makes this structure hashable */
-};
+GLuint textures[4];
 
 struct param {
   char name[10];
@@ -30,7 +25,6 @@ struct param {
 };
 
 struct param *parameters  = NULL;
-struct texture *textures  = NULL;
 
 static void error_callback(int error, const char* description) { fputs(description, stderr); }
 
@@ -110,20 +104,30 @@ void createShader(char *vert, char *frag) {
   glBindVertexArray(VAO);
 };
 
-void readImage(char *name, char *file) {
-  int n = HASH_COUNT(textures);
-  glGenTextures(1, &n);
-  glBindTexture(GL_TEXTURE_2D, n);
+
+void setTextureParams() {
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+  glEnable(GL_TEXTURE_2D);
+  stbi_set_flip_vertically_on_load(1);
+}
+void readImage(char *file, char *name, int32_t t, int i) {
+
+  GLuint tex;
+  glGenTextures(1, &tex);
+  glActiveTexture(GL_TEXTURE0+i);
+  glBindTexture(GL_TEXTURE_2D,tex);
+  setTextureParams();
+  GLint v = glGetUniformLocation(shader, name);
+  printf("loc %.i\n",v);
+  glUniform1i(v, i);
   int comp;
   unsigned char* pixels = stbi_load(file, &width, &height, &comp, STBI_rgb_alpha);
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-  struct texture *t;
-  t = (struct texture*)malloc(sizeof(struct texture));
-  strncpy(t->name, name,10);
-  int v = glGetUniformLocation(shader, name);
-  printf("loc %.i\n",v);
-  glUniform1i(v, n);
-	glBindTexture(GL_TEXTURE_2D, 0);
   stbi_image_free(pixels);
 }
 
@@ -149,7 +153,7 @@ void *readStdin() {
     utstring_printf(name, n);
 
     if (utstring_find(name,0,"img",3) == 0) {
-      readImage(n,strtok(NULL,"\n"));
+      //readImage(n,strtok(NULL,"\n"));
     }
     else if (utstring_find(name,0,"frag",4) == 0) {
       createShader("shader.vert",strtok(NULL,"\n"));
@@ -167,26 +171,55 @@ void *readStdin() {
   }
 }
 
-void setTextureParams() {
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-  //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
-  stbi_set_flip_vertically_on_load(1);
-}
-
 int main(int argc, char **argv) {
 
   createWindow();
   createShader("shader.vert","shader.frag");
+  glUseProgram(shader);
+  /*
+  */
+  readImage(argv[1],"img0",GL_TEXTURE0,0);
+  readImage(argv[2],"img1",GL_TEXTURE1,1);
+  readImage(argv[3],"img2",GL_TEXTURE2,2);
+  readImage(argv[4],"img3",GL_TEXTURE3,3);
+/*
+  glEnable(GL_TEXTURE_2D);
+  //glBindTexture(GL_TEXTURE_2D,0);
+  GLuint tex0;
+    glGenTextures(1, &tex0);
+  glActiveTexture(GL_TEXTURE0);
+  glBindTexture(GL_TEXTURE_2D,tex0);
   setTextureParams();
-  for (int i = 1; i < argc ; i++) {
-    char name[0];
-    sprintf(name,"img%.i",i);
-    readImage(name,argv[i]);
-  }
+
+  GLint v = glGetUniformLocation(shader, "img0");
+  printf("loc %.i\n",v);
+  glUniform1i(v, tex0);
+  int comp;
+  unsigned char* pixels = stbi_load(argv[1], &width, &height, &comp, STBI_rgb_alpha);
+  //printf("%i\n",textures[0]);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+  stbi_image_free(pixels);
+  //glBindTexture(GL_TEXTURE_2D,0);
+
+
+  glBindTexture(GL_TEXTURE_2D,0);
+  glActiveTexture(GL_TEXTURE0);
+  GLuint tex1;
+    glGenTextures(1, &tex1);
+  v = glGetUniformLocation(shader, "img1");
+  printf("loc %.i\n",v);
+  glUniform1i(v, tex1);
+  //glActiveTexture(GL_TEXTURE1);
+  glBindTexture(GL_TEXTURE_2D,tex1);
+  //glBindTexture(GL_TEXTURE_2D,textures[1]);
+  //glBindTexture(GL_TEXTURE_2D,1);
+  pixels = stbi_load(argv[2], &width, &height, &comp, STBI_rgb_alpha);
+  printf("%i\n",tex1);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+  stbi_image_free(pixels);
+  //glBindTexture(GL_TEXTURE_2D,0);
+*/
+
   uniform2f("resolution", width,height);
   pthread_t tid;
   pthread_create(&tid, NULL, readStdin, NULL);
@@ -202,6 +235,15 @@ int main(int argc, char **argv) {
       HASH_DEL(parameters, p);
       free(p);
     }
+    /*
+    struct texture *t, *tmp2;
+    HASH_ITER(hh, textures, t, tmp2) {
+      int v = glGetUniformLocation(shader, t->name);
+      printf("loc %.i\n",v);
+      glUniform1i(v, t->id);
+    }
+    */
+
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     glfwSwapBuffers(window);
     glfwPollEvents();