2012-10-18 16 views
13

का उपयोग कर एंटीअलाइज्ड सर्कल ड्राइंग मैं शेडर प्रोग्रामिंग के लिए नया हूं। मैं glsl के साथ एक सर्कल आकर्षित करने की कोशिश कर रहा हूँ। मैंने एक आकार के साथ एक बिंदु का उपयोग किया और त्रिज्या के बाहर के बिंदुओं को फ़िल्टर करने की कोशिश की। (अल्फा मान को बदलना)। इस प्रकार कोड है:शेडर्स

टुकड़ा 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); 
} 

शीर्ष 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; 
} 

डाटा:

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

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

ड्रा विधि:

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 
} 

इस वर्ग आरेखण में परिणाम अगर मैं निम्न पंक्ति में 1.0 के साथ d की जगह (टुकड़ा शेडर में):

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

मैं बदलने के लिए करने की कोशिश की एक्स और gl_FragColor में textureCoordinate.x और textureCoordinate.y के साथ y मान। परिणाम काला था (इसलिए मुझे लगता है कि मान 0.0 हैं)। जो चीज मुझे समझ में नहीं आती है वह यह है कि यदि मैं हमेशा textureCoordinate की लंबाई लेता हूं तो यह हमेशा 1.0 होता है। (gl_fragcolor में मान को बदलकर प्रयोग किया जाता है)। मैं यह समझने में असमर्थ हूं कि मैं यहां क्या कर रहा हूं। मैं textureCoordinate मूल्य पारित डेटा (varPos) के संबंध में अंतर करने की उम्मीद कर रहा था।

उत्तर

8

यहां मेरा वर्तमान प्रयास है। यह इस अर्थ में काम करता है कि यह एक चिकनी सीमा के साथ डिस्क खींचता है। मैं दूरी क्षेत्र दृष्टिकोण यानी उपयोग करता हूं। मैं डिस्क की सीमा से दूरी की गणना

टुकड़ा शेडर

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

वर्टेक्स शेडर

#version 110 

varying vec2 uv; 

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

यह समन्वय (-0.5, -0.5) x बनावट के साथ ट्रैक्टर पर तैयार किया जा करने के लिए होती है (0.5 , 0.5)

संबंधित मुद्दे