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.x
và textureCoordinate.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
).