私はシェーダープログラミングが初めてです。glslで円を描こうとしています。サイズのあるポイントを使用し、半径の外側のポイントを除外しようとしました (アルファ値の変更)。コードは次のとおりです。
フラグメント シェーダー:
#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);
}
頂点シェーダー:
#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
}
d
次の行 (フラグメント シェーダー内) を 1.0に置き換えると、正方形が描画されます。
gl_FragColor = vec4(0.0, 1.0, 0.0, d); // -> if d is replaced by 1.0
gl_FragColor
x と y の値をtextureCoordinate.x
とに置き換えようとしましたtextureCoordinate.y
。結果は黒でした (値が 0.0 であると仮定します)。私が理解していないことは、 の長さを取ると、textureCoordinate
常に 1.0 になるということです ( の値を置き換えて実験 gl_fragcolor
)。ここで何が間違っているのかわかりません。textureCoordinate
渡されたデータ( )に関して値が補間されることを期待していましたvarPos
。