2012-10-18 20 views
13

Jestem nowy w programowaniu shaderów. Próbuję narysować koło z glsl. Użyłem punktu z rozmiarem i próbowałem odfiltrować punkty poza promieniem (zmieniając wartość alfa). Kod jest w następujący sposób:Rysowanie kółka z wygładzaniem za pomocą shaderów

fragment cieniowania:

#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); 
} 

werteksach:

#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; 
} 

danych:

float pos[] = { 
    -1, -1, 
    -1, 1, 
    1, 1, 
    1, -1, 
}; 

float vertices[]={0.0,0.0f,0.0f,100.0f}; 

Draw Sposób:

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 
} 

Powoduje rysunku kwadrat jeśli wymienić d z 1,0 następującą linię (w cieniującego fragmentu)

gl_FragColor = vec4(0.0, 1.0, 0.0, d); // -> if d is replaced by 1.0 

że próbował zastąpić x i wartości y w gl_FragColor z textureCoordinate.x i textureCoordinate.y. Wynik był czarny (więc zakładam, że wartości wynoszą 0,0). Rzeczą, której nie rozumiem, jest to, że jeśli przyjmuję długość textureCoordinate, to zawsze jest 1.0 (eksperymentowałem zastępując wartość w gl_fragcolor). Nie jestem w stanie dowiedzieć się, co robię źle tutaj. Oczekiwano wartości textureCoordinate interpolacji w odniesieniu do przekazanych danych (varPos).

Odpowiedz

8

Oto moja obecna próba. Działa, w tym sensie, że rysuje dysk z gładką ramką. Używam podejścia z polem odległościowym, tj. I obliczyć odległość od granicy płyty za

cieniującego fragmenty

#version 110 

varying vec2 uv; 

void 
main() { 
    float border = 0.01; 
    float radius = 0.5; 
    vec4 color0 = vec4(0.0, 0.0, 0.0, 1.0); 
    vec4 color1 = vec4(1.0, 1.0, 1.0, 1.0); 

    vec2 m = uv - vec2(0.5, 0.5); 
    float dist = radius - sqrt(m.x * m.x + m.y * m.y); 

    float t = 0.0; 
    if (dist > border) 
     t = 1.0; 
    else if (dist > 0.0) 
     t = dist/border; 

    gl_FragColor = mix(color0, color1, t); 
} 

werteksach

#version 110 

varying vec2 uv; 

void 
main() { 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    uv = vec2(gl_MultiTexCoord0); 
} 

to ma zostać wykorzystany quad z teksturą współrzędnych (-0,5, -0.5) X (0,5 , 0,5)

Powiązane problemy