tutorial touchdesigner shadertoy shaders descargar opengl glsl

opengl - touchdesigner - GLSL sampler2D en struct



opengl shader descargar (1)

En GLSL parece haber un error de vinculación de sombreadores cuando intento pasar una estructura uniforme con un atributo sampler2D a una función que se declara hacia delante. El código funciona si elimino la declaración directa y muevo la función arriba de main. Es este código ilegal?

#version 330 core in vec2 texcoords; out vec4 color; struct Material{ sampler2D tex; // Sampler inside a struct }; uniform Material material; // Forward Declaration vec4 add(Material m); void main() { color = add(material); } // Function Definition vec4 add(Material m) { return vec4(texture(m.tex, texcoords)); } // C++ glUniform1f(glGetUniformLocation(shader, "material.tex"), 0); glBindTexture(GL_TEXTURE_2D, texture);

EDITAR: Entonces, después de buscar un poco, parece ser un error en el controlador de AMD. Personalmente utilizo ATI Mobility Radeon HD 4670, que es bastante antiguo, pero todavía ejecuta OpenGL 3.3. En los foros de AMD encontré una publicación similar , por lo que sería interesante saber qué tan grande es esto en las tarjetas gráficas de AMD. Porque si estás desarrollando Intel o NVidia, ¿cómo vas a saber que tus sombreadores no compilarán en algunas tarjetas gráficas de AMD? ¿Deberíamos estar a salvo y no usar prototipos en estructuras con muestreadores, o incluso ir tan lejos como para no colocar los samplers en struct por completo? ... También vale la pena señalar que WebGL ni siquiera permite muestreadores dentro de las estructuras.

Mensaje de error:

Vertex shader(s) failed to link, fragment shader(s) failed to link. unexpected error. unexpected error.


En realidad, se supone que esto no funciona porque no se puede instanciar una estructura que contiene un tipo de datos opaco (muestreador, imagen, contador atómico). Es aceptable tener una estructura con un tipo opaco como uniforme, pero no se puede implementar la función add (...) pasando una instancia de Material .

Tipo de datos (GLSL) - Tipos opacos

Las variables de tipos opacos solo se pueden declarar en una de dos formas. Se pueden declarar en alcance global, como variables uniformes. Tales variables pueden ser matrices del tipo opaco. Se pueden declarar como miembros de una estructura , pero si es así , la estructura solo se puede usar para declarar una variable uniforme (o para declarar un miembro de una estructura / matriz que a su vez es una variable uniforme). No pueden ser parte de un bloque de interfaz con respaldo de buffer o una variable de entrada / salida, ya sea directa o indirectamente.

Este cambio en su código debería funcionar en todas las implementaciones compatibles de OpenGL:

// Must be in, because you cannot assign values to an opaque type. vec4 add (in sampler2D tex) { return vec4(texture(tex, texcoords)); }

Esto también funcionaría, ya que usa la muestra en el uniforme material.tex :

vec4 add (void) { return vec4(texture(material.tex, texcoords)); }