Salut,
J'ai un petit probléme avec GLSL (Shader)
un message d'erreur s'affiche ( error c5041: cannot locate suitable resource to bind variable Possibly large array)
Qui peut me donner une solution ?
Salut,
J'ai un petit probléme avec GLSL (Shader)
un message d'erreur s'affiche ( error c5041: cannot locate suitable resource to bind variable Possibly large array)
Qui peut me donner une solution ?
Bonjour,
Pouvons nous voir votre shader et si possible, la ligne de l'erreur, merci.
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Salut !
On ne peut pas t'aider car on n'a pas le code du shader incriminé.
Je pense seulement que tu as une variable uniforme de type tableau trop grosse (4096 éléments de 4 octets pour un UBO si je me souviens bien).
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
Bonjour a tous,
Merci de me répondre.
Le code du Vertex Shader le voila :
Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #version 450 #pragma optionNV(unroll all) #pragma optionNV(fastmath on) #pragma optionNV(fastprecision on) #pragma optionNV(ifcvt none) #pragma optionNV(inline all) #pragma optionNV(strict on) uniform vec3 LightPosition, CameraPosition; uniform mat4x4 LightTextureMatrices[250]; uniform mat4 gl_ModelViewProjectionMatrix; out vec3 LightDirection, LightDirectionReflected, CameraDirection, Normal; out vec4 ShadowTexCoord[250]; in vec4 gl_Vertex; in vec3 gl_Normal; vec4 gl_TexCoord[]; in vec4 gl_MultiTexCoord0; void main() { LightDirection = LightPosition - gl_Vertex.xyz; LightDirectionReflected = reflect(-LightDirection, gl_Normal); LightDirectionReflected = vec3(0,0,0); CameraDirection = CameraPosition - gl_Vertex.xyz; Normal = gl_Normal; gl_TexCoord[0] = gl_MultiTexCoord0; for(int i = 0; i < 81; i++) ShadowTexCoord[i] = LightTextureMatrices[i] * gl_Vertex; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
Le code de fragment shader le voila :
Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #version 450 #pragma optionNV(unroll all) #pragma optionNV(unroll count=81) #pragma optionNV(fastmath on) #pragma optionNV(fastprecision on) #pragma optionNV(ifcvt none) #pragma optionNV(inline all) #pragma optionNV(strict on) #extension GL_EXT_texture_array : enable #extension GL_EXT_gpu_shader4 : enable uniform sampler2D Texture; uniform sampler2DArrayShadow ShadowMap; in vec3 LightDirection, LightDirectionReflected, CameraDirection, Normal; in vec4 ShadowTexCoord[30]; out vec4 gl_FragColor; vec4 gl_TexCoord[]; void main(void) { float Shadow = 0.0; for(int i = 0; i < 29; i++) { Shadow += shadow2DArray(ShadowMap, vec4(ShadowTexCoord[i].xy / ShadowTexCoord[i].w, i, ShadowTexCoord[i].z / ShadowTexCoord[i].w)).r; } Shadow /= 29.0; float NdotLD = max(dot(normalize(LightDirection), Normal), 0.0) * Shadow; float Spec = pow(max(dot(normalize(LightDirectionReflected), normalize(CameraDirection)), 0.0), 32.0) * Shadow; gl_FragColor = vec4(texture2D(Texture, gl_TexCoord[0].st).rgb * ( NdotLD ), 1.0); }
Le probléme ce situe au niveaux du fragment shader dans cette ligne :
moi j'ai besoin de ShadowTexCoord[81] et non pas ShadowTexCoord[30];
Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part in vec4 ShadowTexCoord[30];
et meme problème dans la boucle :
moi j'ai besoin de for(int i = 0; i < 81; i++) et pas for(int i = 0; i < 29; i++)
Code glsl : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for(int i = 0; i < 29; i++) { Shadow += shadow2DArray(ShadowMap, vec4(ShadowTexCoord[i].xy / ShadowTexCoord[i].w, i, ShadowTexCoord[i].z / ShadowTexCoord[i].w)).r; }
Merci .
En sortie du vertex shader tu as out vec4 ShadowTexCoord[250]; et en entrée de ton fragment shader tu as in vec4 ShadowTexCoord[30];.
Commence déjà par choisir si tu en veux 250 ou 30.
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
Donc fais le changement en conséquence (remplacer 30 par 250?) et vois si cela résout ton problème.
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
Et donc cela pointe le problème que je supposais, c'est à dire une variable uniforme trop grosse. Il faut donc que tu revoies ta structure de données.
La première chose qui m'interpelle est le nombre de sources lumineuses (250 ? Elles ont toutes une influence discernable sur ton objet ?). Dans mon moteur je passe par une texture 1D pour stocker les lumières, ce qui m'enlève une épine du pied.
De plus tu peux faire le calcul de ShadowTexCoord directement dans le fragment shader, ce qui t'apportera en plus une meilleure précision, contre, il est vrai, une perte de performances.
Du coup tu n'aurais plus que deux variables uniformes (au lieu de ton tableau de 250) : Le sampler1D et le compte des lumières qu'il contient.
Si vous ne trouvez plus rien, cherchez autre chose...
Vous trouverez ici des tutoriels OpenGL moderne.
Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).
Merci pour ta réponse je vais essayé de faire de tes conseils.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager