का उपयोग कर एंटीअलाइज्ड सर्कल ड्राइंग मैं शेडर प्रोग्रामिंग के लिए नया हूं। मैं 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
) के संबंध में अंतर करने की उम्मीद कर रहा था।