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 ?:oops:
Version imprimable
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 ?:oops:
Bonjour,
Pouvons nous voir votre shader et si possible, la ligne de l'erreur, merci.
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).
Bonjour a tous,
Merci de me répondre.
Le code du Vertex Shader le voila :
Code:
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:
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: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:
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.
Donc fais le changement en conséquence (remplacer 30 par 250?) et vois si cela résout ton problème.
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.
Merci pour ta réponse je vais essayé de faire de tes conseils.