2012-10-18 42 views
13

Tôi mới làm quen với lập trình đổ bóng. Tôi đang cố gắng vẽ một vòng tròn với glsl. Tôi đã sử dụng một điểm với một Kích thước và cố gắng lọc ra các điểm bên ngoài bán kính. (Thay đổi giá trị alpha). Mã này được như sau:Vẽ vòng tròn Antialiased bằng Shaders

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

liệu:

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

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

Draw Method:

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ều này dẫn đến vẽ một hình vuông nếu tôi thay d với 1.0 trong dòng sau (trong shader fragment):

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

tôi đã cố gắng để thay thế x và các giá trị y trong gl_FragColor với textureCoordinate.xtextureCoordinate.y. Kết quả là màu đen (vì vậy tôi giả định các giá trị là 0,0). Điều mà tôi không hiểu là nếu tôi có chiều dài textureCoordinate hơn nó luôn luôn là 1.0. (Thử nghiệm bằng cách thay thế giá trị trong gl_fragcolor). Tôi không thể hiểu được những gì tôi đang làm sai ở đây. Tôi đã mong đợi giá trị textureCoordinate để nội suy đối với dữ liệu được chuyển vào (varPos).

Trả lời

8

Đây là nỗ lực hiện tại của tôi. Nó hoạt động, theo nghĩa là nó vẽ một đĩa với một đường viền trơn tru. Tôi sử dụng một cách tiếp cận trường khoảng cách tức là. Tôi tính toán khoảng cách từ biên giới của đĩa

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

Vertex Shader

#version 110 

varying vec2 uv; 

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

Nó có nghĩa là để được vẽ trên quad với kết cấu phối hợp (-0,5, -0,5) x (0,5 , 0.5)

Các vấn đề liên quan