Dessin Anticrénelage de cercle à l'aide de Shaders
Je suis nouveau sur le shader de la programmation. Je suis en train de dessiner un cercle avec glsl. J'ai utilisé un point avec une Taille et essayé de filtrer les points en dehors du rayon.(Modification de la valeur alpha).
Le code est comme suit:
Fragment Shader:
#version 130
varying vec2 textureCoordinate;
const float circleBorderWidth = 0.08;//for anti aliasing
void main() {
float d = smoothstep(circleBorderWidth,0.1, 1.0-length(textureCoordinate));
gl_FragColor = vec4(0.0, 1.0, 0.0, d);
}
Vertex Shader:
#version 130
attribute vec4 coord3d;
attribute vec2 varPos;
varying vec2 textureCoordinate;
void
main()
{
textureCoordinate = varPos;
gl_FrontColor = gl_Color;
gl_Position = vec4(coord3d.xyz,1.);
gl_PointSize = coord3d.w;
}
Données:
float pos[] = {
-1, -1,
-1, 1,
1, 1,
1, -1,
};
float vertices[]={0.0,0.0f,0.0f,100.0f};
La Méthode De Tirage:
void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
program->makeCurrent();
glEnable(GL_POINT_SMOOTH);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if (varPosAttrib>=0) {
glVertexAttribPointer( varPosAttrib, 2, GL_FLOAT, GL_FALSE,
0, pos ); //-->varPos in Vertex Shader.
glEnableVertexAttribArray( varPosAttrib );
}
if (posAttrib>=0) {
glVertexAttribPointer(posAttrib, 4, GL_FLOAT, GL_FALSE, 0, vertices); //-->coord3d in vertex shader
glEnableVertexAttribArray(posAttrib);
glDrawArrays(GL_POINTS, 0, 1);
}
glDisable(GL_POINT_SMOOTH);
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
glDisable(GL_BLEND);
program->release();
glutSwapBuffers(); //Send the 3D scene to the screen
}
Cette résultats dans le dessin d'un carré si je remplace d
avec la 1.0 à la ligne suivante (dans le fragment shader):
gl_FragColor = vec4(0.0, 1.0, 0.0, d); //-> if d is replaced by 1.0
J'ai essayé de remplacer les valeurs x et y dans gl_FragColor
avec textureCoordinate.x
et textureCoordinate.y
. Le résultat était noir (donc je suppose que les valeurs sont 0.0). La chose que je ne comprends pas, c'est que si je prends la longueur de textureCoordinate
que c'est toujours 1.0.(expérimenté par le remplacement de la valeur dans gl_fragcolor
). Je suis incapable de comprendre que ce que je fais de mal ici. Je m'attendais à la textureCoordinate
valeur pour interpoler à l'égard de la transmission de données (varPos
).
OriginalL'auteur user1754682 | 2012-10-18
Vous devez vous connecter pour publier un commentaire.
Voici ma tentative. Il fonctionne, dans le sens où il dessine un disque avec une lisse de la frontière. J'utilise un champ de distance démarche d'ie. Je calcule la distance entre le disque de la frontière
Fragment shader
Vertex shader
Il est destiné à être tiré sur quad avec des coordonnées de texture (-0.5, -0.5)x(0.5, 0.5)
sqrt
dansdist
.OriginalL'auteur Monkey