2012-10-18 26 views
13

Kullanarak ölçeklendirilmiş daire gölgelendirici programlamada yeniyim. Glsl ile bir daire çizmeye çalışıyorum. Boyutlu bir nokta kullandım ve yarıçap dışındaki noktaları filtrelemeye çalıştım (alfa değerini değiştirme). aşağıdaki kod gibidir:Çizim Shader

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

Veri:

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

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

Çizim Yöntem:

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 
} 

I (parça gölgelendirici) Aşağıdaki doğrultusunda 1.0 ile d yerine, bu, bir kare çizim ile sonuçlanır:

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

I yerine çalıştı X ve y değerleri, textureCoordinate.x ve textureCoordinate.y ile gl_FragColor'da. Sonuç siyahtı (bu yüzden değerlerin 0.0 olduğunu varsayalım). Anlamadığım şey, textureCoordinate uzunluğunu her zaman 1.0 olduğundan (gl_fragcolor değerinde değiştirerek deneniyor) alabilmem. Burada yanlış yaptığım şeyi anlayamıyorum. Geçilen verilerle ilgili olarak (varPos) textureCoordinate değerini bekliyorum.

cevap

8

İşte şu anki denemem. Düz bir sınıra sahip bir disk çizmesi anlamında çalışır. Uzak mesafe yaklaşımı kullanıyorum yani. Ben diskin sınırı mesafeyi hesaplamak

Fragman Shader

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

O (-0.5, -0.5) x koordinatı doku ile dörtlü çizilecek için yaratılmış

#version 110 

varying vec2 uv; 

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

Vertex Shader (0.5 , 0.5)