2010-11-05 7 views
4

J'ai du mal à déboguer mon programme. J'essaie d'utiliser un tableau comme une table de recherche pour compenser l'emplacement du vertex dans mon vertex shader, mais je ne peux même pas dire si je relie correctement mon tableau. Le facteur de décalage finit toujours par zéro (aplatir mes vecteurs, plutôt que de leur donner une forme), donc soit j'accède mal aux coordonnées texture1D, soit le tableau ne lie pas directement à la texture. Franchement, je ne sais pas quelles coordonnées je devrais utiliser pour obtenir les valeurs d'une texture 1D ... mais j'ai essayé toutes les combinaisons.GLSL Vertex Shader table de correspondance question

Ici je configurer le tableau et le lier au shader:

//FISH 
GLfloat fish_coords[100]; 
for (int i = 0; i < 50; i++){fish_coords[i] = 0;} 
for (int i = 50; i < 100; i++){fish_coords[i] = 1;} 
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

glGenTextures(1, &fishtexture); 
glBindTexture(GL_TEXTURE_1D, fishtexture); 
glTexImage1D(GL_TEXTURE_1D, 0, 1, 128,0,GL_RGBA, GL_UNSIGNED_BYTE, &fish_coords); 

switch(shadow_selection){ 
case 0: 
    vertexShader = "fish.vert"; 
    fragmentShader = "fish.frag"; 
    setShaders(); 

    GLint loc1; 
    loc1 = glGetUniformLocation(shaderProgram,"fish_coords"); 
    glUniform1i(loc1,0);  

Et mon vertex shader:

uniform float spec_factor; 
uniform sampler1D fish_coords; 

varying vec3 lightDir,normal; 

void main() 
{ 

    vec4 v_pos; 
    vec3 ldir; 

    gl_TexCoord[0] = gl_MultiTexCoord0; 

    v_pos = gl_ModelViewMatrix * gl_Vertex; 
    ldir = vec3(gl_LightSource[0].position-v_pos); 
    lightDir = normalize(ldir); 
    normal = normalize(gl_NormalMatrix * gl_Normal); 

    vec4 offset; 
    offset = texture1D(fish_coords, gl_TexCoord[0].r); 

    vec4 fish_shape; 
    fish_shape.xz = gl_Vertex.xz; 
    fish_shape.y = gl_Vertex.y * offset.x; 
    fish_shape.w = 1; 

    gl_Position = gl_ModelViewProjectionMatrix * fish_shape; 
} 
+1

La réponse rapide est: Ce n'est pas comment vous chargez une texture. Lier sélectionne une texture par identifiant sur lequel vous voulez opérer. Vous allouez des identifiants avec glGenTextures, les liez, les chargez (par exemple avec glTexImage1D) et * puis * les utilisez. –

+0

ah, je pensais que les tables de recherche étaient une sorte de hack avec les textures, c'est pourquoi je ne faisais pas ça. Merci. – jakev

+0

Ok, donc ça a changé ... Je ne m'en approche plus. – jakev

Répondre

3

Il y a deux problèmes dans votre texture code de chargement:

1 .- Le filtre MIN par défaut utilise mipmaps, donc avec cette configuration la texture est incomplète. Définissez les filtres MIN/MAG après avoir lié la texture à GL_NEAREST. 2.- Vos données de texture sont flottantes, mais vous dites à GL qu'elles sont des octets non signés, changez cela en GL_FLOAT. Après cette modification, votre texture devrait apparaître.

+0

Ah! Je vous remercie. C'était exactement ce que j'avais besoin de réparer. – jakev

1

Il y a une commande GLSL qui vous permet d'accéder à texels unique d'une texture, sans aucun filtrage de texture: texelFetch Au lieu d'utiliser les coordonnées normalisées (0-1), il utilise des entiers, donc texelFetch (32, 32) irait chercher le texel 32 texel à droite et 32 ​​texels vers le bas. Il semble que vous écrivez assez GLSL old school, donc je ne sais pas comment il est applicable.

Attention: Si vous compilez vos programmes GLSL sur une carte Nvidia, avec les pilotes Nvidia, il compilera comme s'il s'agissait d'un CG, ce qui a une drôle de mise en garde. Il est intéressant de noter que si vous essayez d'accéder à un index d'un tableau suffisamment grand (vous utilisez une texture comme un tableau, cela ne devrait pas poser de problème) en utilisant une valeur codée en dur pour l'index, il sera compilé. Toutefois, si vous utilisez un index dynamique (variable) pour accéder à un champ du même tableau, il ne sera pas compilé. La raison est que le compilateur Nvidias optimise tous les index qui ne sont pas utilisés (puisque vous utilisez une valeur codée en dur, le compilateur pense qu'il peut jeter les autres valeurs de tableau)!

Cela m'a donné un mal de tête il y a quelques années. Incidemment, je vois que vous essayez de rendre une école de poissons ou quelque chose, cela semble intéressant, n'importe quel endroit où vous avez une démo?

Questions connexes