2015-11-01 2 views
0

Je travaille sur un système de particules simple en OpenGL; Jusqu'à présent, j'ai écrit deux shaders de fragments pour mettre à jour les vélocités et les positions en réponse à ma souris, et ils semblent fonctionner! J'ai regardé ces deux textures et elles semblent toutes les deux répondre correctement (passant du bruit aléatoire à une structure ordonnée en réponse à ma souris).Vertex Shader pour un système de particules

Cependant, j'ai des problèmes avec la façon de dessiner les particules. Je suis plutôt nouveau dans les shaders de vertex (ayant précédemment utilisé seulement des shaders fragmentés); je crois savoir que la façon habituelle est un vertex shader comme ceci:

uniform sampler2DRect tex; 
varying vec4 cur; 

void main() { 
    gl_FrontColor = gl_Color; 
    cur = texture2DRect(tex, gl_Vertex.xy); 
    vec2 pos = cur.xy; 
    gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 0., 1.); 
} 

transformerait les coordonnées au bon endroit en fonction des valeurs dans la mémoire tampon de position. Cependant, j'obtiens des erreurs de glissement quand je cours ceci qu'il ne peut pas être compilé - après quelques recherches, il semble que gl_ModelViewProjectionMatrix soit déprécié.

Quelle serait la bonne façon de le faire maintenant que la matrice de vue de modèle est obsolète? Je n'essaie pas de faire quelque chose de fantaisie avec la perspective, j'ai juste besoin d'une vue orthogonale simple de la texture.

merci!

+0

Si vous avez juste besoin d'une vue orthogonale simple, pourquoi utiliser des matrices? – CoffeeandCode

+0

Le simple paramétrage de 'gl_Position = vec4 (pos, 0., 1.);' Ne semble pas fonctionner - bien que je suppose que cela pourrait être un problème de shader de fragment si cela devrait être correct! –

Répondre

2

Quelle version de GLSL utilisez-vous (ne voyez pas de directive #version)? Oui, je pense que gl_ModelViewProjectionMatrix est vraiment obsolète. Cependant, si vous voulez l'utiliser peut-être this pourrait aider. Par ailleurs, le qualificatif varying est assez vieux aussi. Je préfère utiliser les qualificatifs in et out, ce qui rend votre code plus lisible.

La façon «correcte» de faire cela est de créer vos propres matrices - modèle et vue (utilisez la librairie glm par exemple) et de les multiplier, puis de les transmettre uniformément à votre shader. Tutoriel avec un exemple peut être trouvé here.

Voici mon vs shaders i utilisé pour afficher la texture (plein écran quad):

#version 430 

layout(location = 0) in vec2 vPosition; 
layout(location = 1) in vec2 vUV; 

out vec2 uv; 

void main() 
{ 
    gl_Position = vec4(vPosition,1.0,1.0); 
    uv = vUV; 
} 

fragment shader:

#version 430 

in vec2 uv; 
out vec4 final_color; 
uniform sampler2D tex; 

void main() 
{ 
    final_color = texture(tex, uv).rgba; 
} 

et voici mes coordonnées (le mien sont statiques, mais vous pouvez changer et mettre à jour le buffer - shader peut être le même):

//Quad verticles - omitted z coord, because it will always be 1 
float pos[] = { 
    -1.0, 1.0, 
    1.0, 1.0, 
    -1.0, -1.0, 
    1.0, -1.0 
}; 

float uv[] = { 
    0.0, 1.0, 
    1.0, 1.0, 
    0.0, 0.0, 
    1.0, 0.0 
}; 

Vous pourriez peut-être essayer de désactiver la profondeur comparaison avant d'exécuter ce shader glDisable(GL_DEPTH_TEST);