Opengl erreur 1282 (opération non valide) lors de l'utilisation de la texture()
J'ai le fragment shader:
#version 330 core
layout (location = 0) out vec4 color;
uniform vec4 colour;
uniform vec2 light_pos;
in DATA
{
vec4 position;
vec2 texCoord;
float tid;
vec4 color;
} fs_in;
uniform sampler2D textures[32];
void main()
{
float intensity = 1.0 / length(fs_in.position.xy - light_pos);
vec4 texColor = fs_in.color;
if (fs_in.tid > 0.0)
{
int tid = int(fs_in.tid + 0.5);
texColor = texture(textures[tid], fs_in.texCoord);
}
color = texColor * intensity;
}
Si je lance mon programme, j'obtiens opengl erreur 1282, ce qui n'est pas valide l'opération. Si je n'utilise pas la texture(), donc j'écris texCoord = vec4 (...), il fonctionne parfaitement. Je suis toujours en passant tid (l'IDENTIFIANT de la texture) à 0 (pas de texture) de sorte qu'une partie ne devrait même pas courir. J'ai mis les textures uniformes pour certains réservé, mais autant que je sache, cela ne devrait pas même question. Quelle est la cause de l'opération non valide alors?
Vous devez vous connecter pour publier un commentaire.
Votre shader compilation a échoué. Assurez-vous de toujours vérifier que la compilation d'état, après avoir essayé de compiler le shader, à l'aide de:
Dans votre cas, le shader est illégal parce que vous essayez d'accéder à une multitude de échantillonneurs avec un indice de variable:
Ce n'est pas pris en charge dans GLSL 3.30. À partir de la spécification (italiques ajoutés):
Cette restriction est levée à plus tard les versions d'OpenGL. Par exemple, à partir du GLSL 4.50 spec:
Cette modification a été introduite en GLSL 4.00. Mais il serait encore ne pas être suffisant pour votre cas, puisque vous essayez d'utiliser un
in
variable comme l'index, ce qui n'est pas dynamiquement uniforme.Si vos textures sont toutes de la même taille, vous pouvez envisager d'utiliser un tableau de la texture à la place. Qui vous permettra de déguster l'une des couches de la matrice de texture basée sur une calculées dynamiquement index.
Je sais que cette solution est en retard, mais si elle aide à personne..
Comme par Cherno de la vidéo, cela devrait fonctionner. Cependant, il utilise l'attribut " fs_in.tid' comme un 'GL_BYTE" dans le gl_VertexAttribPointer fo l'indice de la texture, pour une raison quelconque au sujet de la coulée 1.0 f toujours eu converti à 0.0 f, et donc n'a pas de travail.
Changer GL_BYTE à GL_FLOAT, a résolu ce problème pour moi.
À propos de la "opengl erreur 1282', c'est une erreur très commune que je face. J'ai utilisé pour oublier d'appeler glUseProgram(ShaderID) avant de régler l'une quelconque des uniformes. De ce fait, les uniformes, même si pas utilisé/set à la fois peut provoquer une erreur, à savoir "1282'. Cela pourrait être une des solutions, cela a résolu pour moi.