Mon fragment shader de displacement ne fonctionne pas.
Je souhaite redessiner une nouvelle frame avec des données de l'ancienne frame, mais ça ne fonctionne pas.
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
|
const std::string transfFragVertexShader =
R"(#version 130
out mat4 newViewMatrix;
out mat4 projMat;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
newViewMatrix = gl_ModelViewMatrix;
projMat = gl_ProjectionMatrix;
})";
const std::string transfFragFragmentShader =
R"(#version 130
uniform mat4 oldViewMatrix;
in mat4 newViewMatrix;
in mat4 projMat;
uniform vec3 resolution;
uniform sampler2D oldFrameBuffer;
void main() {
vec4 oldFragPos = inverse(projMat) * gl_FragCoord;
oldFragPos /= oldFragPos.w;
oldFragPos = inverse(newViewMatrix) * oldViewMatrix * oldFragPos;
oldFragPos /= oldFragPos.w;
oldFragPos = oldFragPos * projMat;
vec2 position = (resolution.xy / oldFragPos.xy);
gl_FragColor = texture2D(oldFrameBuffer, position);
})";
Edit / Delete Edit Post Quick reply to this message Reply Reply With Quote Reply With Quote Multi-Quote This Message |
Et peut importe la couleur que j'affecte à gl_FragColor ça ne m'affiche toujours rien.
Comment avoir les coordonnées vue du fragment pour le transformer en coordonnées vue de l'ancienne vue ?
1 pièce(s) jointe(s)
Comment avoir la position du fragment sur la frame précédente ?
Bon j'ai essayé plusieurs choses mais ça ne fonctionne pas.
Tout d'abord j'ai essayé de faire simple en passant juste un offset au shader. (la translation de la caméra)
Code:
1 2 3
|
math::Vec3f offsets = view.getPosition() - previousView.getPosition();
transformFragShader.setParameter("uoffsets", offsets.x, offsets.y); |
Code:
1 2 3 4 5 6 7
|
vec2 position = (vec2(gl_FragCoord.x + uoffsets.x, gl_FragCoord.y - uoffsets.y) / resolution.xy);
vec4 colors[2];
colors[0] = vec4(0, 0, 0, 0);
colors[1] = texture2D(oldFrameBuffer, position);
bool b = (position.x >= 0 && position.y >= 0 && position.x <= resolution.x && position.y <= resolution.y);
gl_FragColor = colors[int(b)]; |
Mais ça me donne un effet bizarre sur les bords lorsque je déplace la caméra vers la droite ou vert le haut et donc, lorsque position > resolution. Normalement ça devrait m'afficher de la transparence (et donc rien) mais au lieu de ça, ça m'affiche un mauvais fragment, bref voici ce que ça me donne :
Pièce jointe 445582
J'ai essayé autre chose, c'est de récupérer les coordonnées vue du fragment et le reprojeter en le multipliant par la matrice de vue de la frame précédente mais ça ne fonctionne pas non plus. -_-
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
|
const std::string transfFragVertexShader =
R"(#version 130
out mat4 projMat;
out mat4 newViewMatrix;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
projMat = gl_ProjectionMatrix;
newViewMatrix = gl_ModelViewMatrix;
})";
const std::string transfFragFragmentShader =
R"(#version 130
uniform mat4 oldViewMatrix;
uniform mat4 viewportMatrix;
in mat4 projMat;
in mat4 newViewMatrix;
uniform vec3 resolution;
uniform sampler2D oldFrameBuffer;
uniform vec2 uoffsets;
void main() {
vec4 ndc_coords = inverse(viewportMatrix) * gl_FragCoord;
vec4 clip_coords = inverse(projMat) * ndc_coords;
clip_coords /= clip_coords.w;
vec4 eyes_coords = inverse(newViewMatrix) * clip_coords;
eyes_coords = oldViewMatrix * eyes_coords;
clip_coords = projMat * eyes_coords;
clip_coords /= clip_coords.w;
vec4 old_FragCoord = viewportMatrix * clip_coords;
vec2 position = (old_FragCoord / resolution.xy);
vec4 colors[2];
colors[0] = vec4(0, 0, 0, 0);
colors[1] = texture2D(oldFrameBuffer, position);
bool b = (position.x >= 0 && position.y >= 0 && position.x <= resolution.x && position.y <= resolution.y);
gl_FragColor = colors[int(b)];
})"; |
Ce qui pourtant fonctionne lorsque je le fais au niveau du CPU :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
RenderWindow window(sf::VideoMode(800, 600), "test");
View currentView(600, 800, 0, 600);
currentView.move(300, 300, 300);
Vec3f point(0, 0, 0);
Vec3f fragCoord = window.mapCoordsToPixel(point, currentView);
View previousView(600, 800, 0, 600);
Vec3f pointToHave = window.mapCoordsToPixel(point, previousView);
std::cout<<currentView.getViewVolume().getPosition()<<"frag coord : "<<fragCoord<<" point to have : "<<pointToHave<<std::endl;
fragCoord = window.mapPixelToCoords(fragCoord, currentView);
fragCoord = window.mapCoordsToPixel(fragCoord, previousView);
std::cout<<"coords : "<<fragCoord<<std::endl;
return 0; |
Bref je ne sais plus trop quoi comment faire. (Hummm.....) Il me semble que opengl utilise le coin inférieur gauche comme coordonnée (0, 0) hors que moi j'utilise le coin supérieur gauche mais je ne pense pas que cela aie un impact avec la matrice du viewport...